[windows] UnicodeDecodeError : ‘charmap’코덱은 Y 위치에서 바이트 X를 디코딩 할 수 없습니다 : 문자가 <정의되지 않음>

정보로 채워진 텍스트 파일로 일부 조작을 수행하는 Python 3 프로그램을 얻으려고합니다. 그러나 파일을 읽으려고 할 때 다음 오류가 발생합니다.

 Traceback (most recent call last):  
     File "SCRIPT LOCATION", line NUMBER, in <module>  
     `text = file.read()`  
     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 0x90 in position 2907500: character maps to `<undefined>`  



답변

문제의 파일이 CP1252인코딩을 사용하지 않습니다 . 다른 인코딩을 사용하고 있습니다. 어느 것을 스스로 알아 내야합니까? 일반적인 것은 Latin-1UTF-8입니다. 이후 0x90가 실제로에서 평균 아무것도하지 않는 Latin-1, UTF-8( 0x90이 연속 바이트)를 가능성이 높습니다.

파일을 열 때 인코딩을 지정합니다.

file = open(filename, encoding="utf8")


답변

file = open(filename, encoding="utf8")시도하지 않는 경우에 추가하기 만하면됩니다.file = open(filename, errors='ignore')


답변

@LennartRegebro의 답변에 대한 확장으로 :

파일에서 어떤 인코딩을 사용하는지 알 수없고 위의 솔루션이 작동하지 않고 (그렇지 않은 경우 utf8) 추측 만하 는 경우, 어떤 인코딩인지 식별하는 데 사용할 수 있는 온라인 도구 가 있습니다. 그들은 완벽하지는 않지만 일반적으로 잘 작동합니다. 인코딩을 알아 낸 후에는 위의 솔루션을 사용할 수 있어야합니다.

편집 : (의견에서 복사)

인기있는 텍스트 편집기 Sublime Text에는 인코딩이 설정된 경우 표시하는 명령이 있습니다 …

  1. 이동 View-> Show Console(또는 Ctrl+ `)

여기에 이미지 설명을 입력하십시오

  1. 맨 아래에 필드에 입력 view.encoding()하고 최고를 기대하십시오 (나는 아무것도 얻을 수 Undefined없지만 어쩌면 더 나은 행운을 가질 것입니다 …)

여기에 이미지 설명을 입력하십시오


답변

또는 파일을 웹 사이트에 업로드하는 등 파일을 디코딩 할 필요가없는 경우 open(filename, 'rb'). r = 판독 값, b = 이진


답변

TLDR? 시험:file = open(filename, encoding='cp437)

왜? 한 번 사용할 때 :

file = open(filename)
text = file.read()

파이썬은 파일이 현재 환경과 동일한 코드 페이지 (오픈 포스트의 경우 cp1252)를 사용하고 파일을 자체 기본 UTF-8로 디코딩하려고 시도한다고 가정합니다. 파일에이 코드 페이지에 정의되지 않은 값 (예 : 0x90)의 문자가 포함되어 있으면 UnicodeDecodeError가 발생합니다. 때때로 우리는 파일의 인코딩을 모르고, 때로는 파일 인코딩이 파이썬에 의해 처리되지 않을 수 있습니다 (예를 들어 cp790), 때로는 파일에 혼합 인코딩이 포함될 수 있습니다.

그러한 문자가 필요하지 않으면 다음과 같이 물음표로 대체 할 수 있습니다.

file = open(filename, errors='replace')

또 다른 해결 방법은 다음을 사용하는 것입니다.

file = open(filename, errors='ignore')

그런 다음 문자는 그대로 유지되지만 다른 오류도 숨겨집니다.

아주 좋은 해결책 은 인코딩을 지정하는 것입니다 (cp1252와 같은 인코딩은 아님). 그러나 모든 문자가 정의 된 (cp437과 같은) 인코딩을 지정하는 것입니다.

file = open(filename, encoding='cp437')

코드 페이지 437은 원래 DOS 인코딩입니다. 모든 코드가 정의되므로 파일을 읽는 동안 오류가 발생하지 않으며, 오류가 마스킹되지 않으며, 문자가 유지됩니다 (손상되지 않은 채로 여전히 구별 가능).


답변

Windows의 Anaconda에서 일하는 사람들에게는 동일한 문제가 있습니다. 메모장 ++로 해결할 수 있습니다.

메모장 ++에서 파일을 엽니 다. 오른쪽 하단에 현재 파일 인코딩이 표시됩니다. 최상위 메뉴에서 “보기”옆의 “인코딩”을 찾으십시오. “인코딩”에서 “문자 세트”로 가서 환자가 필요한 enconding을 찾으십시오. 제 경우에는 “Windows-1252″인코딩이 “서유럽 어”아래에 있습니다.


답변

시간을 낭비하지 말고 다음 encoding="cp437"errors='ignore'코드를 읽기와 쓰기로 모두 추가하십시오 .

open('filename.csv', encoding="cp437", errors='ignore')
open(file_name, 'w', newline='', encoding="cp437", errors='ignore')

Godspeed