:: python

python :: PyYAML yaml.load 시 ReaderError: unacceptable character: special characters are not allowed 오류 해결

토람이 2022. 1. 4. 21:23

파이썬으로 yaml 파일을 읽기 위해 PyYAML 라이브러리를 사용,

yaml.load 로 파일을 불러오려다가 다음 에러가 났다.

 

File "/usr/local/lib/python3.6/site-packages/yaml/reader.py", line 89, in peek
  return self.buffer[self.pointer+index]
IndexError: string index out of range


File "/usr/local/lib/python3.6/site-packages/yaml/reader.py", line 144, in check_printable
  'unicode', "special characters are not allowed")
yaml.reader.ReaderError: unacceptable character #x0087: special characters are not allowed

 

 

"special characters are not allowed"

유니코드 특수문자 중에서 yaml load 시 허용되지 않는 문자들이 있는 듯하다.

 

'utf-8' 에서 다른 encoding 방식으로 변경하는 걸로는 해결이 되지 않았다.

(구글링 한다고 꽤 고생함 ㅠ_ㅠ)

 

 

1. yaml reader 에서 인식 불가능한 문자: NON_PRINTABLE characters

에러 문구를 보면 yaml reader 의 'check_printable' 에서 에러가 발생했다.

yaml reader 는 문자가 'printable' 한 문자인가? 를 체크하고,

그렇지 않은 경우 에러를 발생시키는 듯하다.

 

즉, 위에서 yaml load 시 나타난 에러는

printable 하지 않은 문자가 포함된 파일을 load 하여 발생한 에러다.

 

그럼 어떤 문자가 printable 한 문자일까?

 

import yaml

print(yaml.reader.Reader.NON_PRINTABLE)


# re.compile('[^\t\n\r -~\x85\xa0-\ud7ff\ue000-�-\U0010ffff]')

 

위와 같이 yaml reader 에 'NON_PRINTABLE' 이 정의되어 있다.

찍어보니 re.compile 을 통해 패턴을 정규식 객체로 컴파일한 것인데,

패턴에 걸리는 문자들 => NON_PRINTABLE

그 외 문자들 => PRINTABLE

이라고 보면 될 것 같다.

 

 

2. NON_PRINTABLE 재정의하기

import yaml
import re

yaml.reader.Reader.NON_PRINTABLE = re.compile('[^\t\n\r -�-\U0010ffff]')

 

패턴 중간에 있는 문자 code 스러운 부분을 제거하고 위와 같이 줄여보았다.

해당 내용을 NON_PRINTABLE 로 재정의하고

이후에 yaml load 를 다시 시도해보니 잘 되는 것 확인!

 

PyYAML 로 특수한 유니코드 문자를 정상적으로 인식되게 하려면

위 방법으로 해결하면 된다 :D

 

300x250