문제

나는 다음과 같은 단위 테스트에서 많은 역추적을 얻는 일련의 파서를 작업하고 있습니다.

  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)을 클릭합니다.브라우저는 [보통 안정적으로] 어떤 인코딩을 추측했습니까?

기타 가능한 인코딩 단서:파일의 텍스트에 어떤 언어가 사용됩니까?파일은 어디서 구하셨나요?

메모:명확한 정보로 질문을 편집하십시오.댓글에 답하지 마세요.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top