CP-1252/ANSI 읽기 시 Python 3이 질식함
-
17-09-2020 - |
문제
나는 다음과 같은 단위 테스트에서 많은 역추적을 얻는 일련의 파서를 작업하고 있습니다.
File "c:\Python31\lib\encodings\cp1252.py", line 23, in decode
return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 112: character maps to <undefined>
파일은 추가 인수 없이 open()을 사용하여 열립니다.open()에 추가 인수를 전달하거나 코덱 모듈의 항목을 사용하여 다르게 열 수 있습니까?
이것은 Python 2로 작성된 코드를 2to3 도구를 사용하여 3으로 변환한 것입니다.
업데이트:이는 zip 파일을 파서에 공급한 결과인 것으로 밝혀졌습니다.단위 테스트에서는 실제로 이런 일이 발생할 것으로 예상합니다.파서는 이를 파싱할 수 없는 것으로 인식해야 합니다.따라서 예외 처리를 변경해야 합니다.지금은 그 일을 하고 있는 중이에요.
해결책
위치 0x81은 Windows-1252 (일명 CP1252)에서 할당되지 않습니다.Latin-1 (일명 ISO 8859-1)에서 U + 0081 높은 옥텟 프리셋 (홉) 제어 문자에 할당됩니다.이와 같이 Python 3.1에서 오류를 재현 할 수 있습니다.
>>> b'\x81'.decode('cp1252')
Traceback (most recent call last):
...
UnicodeDecodeError: 'charmap' codec can't decode byte 0x81 in position 0: character maps to <undefined>
.
또는 실제 파일로 :
>>> open('test.txt', 'wb').write(b'\x81\n')
2
>>> open('test.txt').read()
Traceback (most recent call last):
...
UnicodeDecodeError: 'utf8' codec can't decode byte 0x81 in position 0: unexpected code byte
.
이제이 파일을 latin-1로 취급하려면 codeape와 같은 encoding
인수를 전달합니다.
>>> open('test.txt', encoding='latin-1').read()
'\x81\n'
.
Windows-1257과 Latin-1 인코딩에는 차이가 있음을 조심하십시오.Latin-1에는 "Smart Quotes"가 없습니다.처리중인 파일이 텍스트 파일 인 경우 \ x81이 수행하는 작업을 직접 요청하십시오.
다른 팁
오류 처리를 완화 할 수 있습니다.
예 :
f = open(filename, encoding="...", errors="replace")
.
또는 :
f = open(filename, encoding="...", errors="ignore")
.
문서 .
편집 :
그러나 문제가 파일을 읽는 데 문제가 있습니까?콘솔에 뭔가 쓰여질 때 예외가 발생할 수 있습니까? http://wiki.python.org/moin/printfails
모든 파일은 "유니코드가 아닙니다".유니코드는 인코딩되어야 하는 내부 표현입니다.각 파일에 대해 어떤 인코딩이 사용되었는지 확인하고 파일을 열 때 필요한 곳에 이를 지정해야 합니다.
추적 및 오류 메시지에서 알 수 있듯이, 문제의 파일은 다음으로 인코딩되지 않았습니다. cp1252
.
인코딩된 경우 latin1
, "\x81"
불평하는 것은 이름조차 없는(유니코드) C1 제어 문자입니다. 고려하다 latin1
타당할 가능성이 매우 낮습니다.
"일부 파일이 xml.dom.minidom으로 구문 분석되었습니다"라고 말씀하셨습니다. 구문 분석이 성공했습니까 아니면 실패했습니까?
유효한 XML 파일은 첫 번째 줄에서 인코딩(기본값은 UTF-8)을 선언해야 하며 코드에서 인코딩을 지정할 필요가 없습니다.xml.dom.minidom 구문 분석을 수행하는 데 사용하는 코드를 보여주세요.
"다른 사람들은 iterables로 직접 읽습니다." -- 샘플 코드를 부탁드립니다.
제안:브라우저에서 각 유형의 파일을 열어보세요.그런 다음 보기를 클릭하고 문자 인코딩(Firefox) 또는 인코딩(Internet Explorer)을 클릭합니다.브라우저는 [보통 안정적으로] 어떤 인코딩을 추측했습니까?
기타 가능한 인코딩 단서:파일의 텍스트에 어떤 언어가 사용됩니까?파일은 어디서 구하셨나요?
메모:명확한 정보로 질문을 편집하십시오.댓글에 답하지 마세요.