파이썬으로 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
':: python' 카테고리의 다른 글
python :: 파이썬 텍스트 파일 문자열에서 \ufeff 제거하는 방법 (BOM 이란?) (0) | 2022.01.19 |
---|---|
python :: 파이썬 open 함수로 텍스트 파일 읽기, 쓰기 (0) | 2022.01.12 |
python :: 파이썬 웹페이지 url 에서 json 데이터 가져오기 (구글 애드센스 sellers.json 에서 자신의 사용자 정보 찾기) (0) | 2022.01.02 |
python :: shutil.copy 리눅스 네트워크 드라이브로 파일 복사 시 WinError 해결 (0) | 2021.12.30 |
python :: 파이썬 re 로 정규식 패턴 문자열 처리하기 (search/match/split/sub/compile) (2) | 2021.12.29 |