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


549

정보로 채워진 텍스트 파일로 일부 조작을 수행하는 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>`  

2
같은 이러한 솔루션이 도움이되었습니다 오류에 대한 문자표 오류의 솔루션
하기 Shubham 샤르마

2
이 오류가 발생하는 이유를 이해하려면 Python 3에서 텍스트 파일 처리를 참조하십시오 .
Andreas Haferburg

답변:


960

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

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

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

19
쿨, 나는 파이썬 3.4에서 실행하려고했던 파이썬 2.7 코드에 그 문제가 있었다. 라틴 -1이 나를 위해 일했다!
1vand1ng0

2
Python 2.7을 사용하고 동일한 오류가 발생하면 io모듈을 시도하십시오 .io.open(filename,encoding="utf8")
christopherlovell

9
@ 1vand1ng0 : 물론 라틴 -1 작품; 파일의 실제 인코딩이 무엇이든 관계없이 모든 파일에서 작동합니다. 파일에서 256 개의 가능한 바이트 값이 모두 매핑 할 Latin-1 코드 포인트를 갖기 때문에 읽기 쉬운 결과를 얻을 수있는 것은 아닙니다! 인코딩을 모르는 경우 파일을 바이너리 모드로 여는 것보다 Latin-1을 가정하는 것보다 낫습니다.
Martijn Pieters

1
기본적으로 유니 코드이지만 유니 코드는 인코딩이 아닙니다. regebro.wordpress.com/2011/03/23/…
Lennart Regebro

1
filename = "C:\Report.txt" with open(filename,encoding ="utf8") as my_file: text = my_file.read() print(text)이것을 사용한 후에도 같은 오류가 발생합니다. 나는 또한 다른 인코딩으로 시도했지만 모두 헛된 것입니다. 이 코드에서는을 사용하고 from geotext import GeoText있습니다. 해결책을 제안하십시오.
Salah

47

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


많은 감사-나는 이것을 시도 할 것입니다. 신경 쓰지 않는 파일 부분에 잘못된 문자가 있습니다.
Stephen Nutt

6
경고 : 알 수없는 문자가 발생하면 데이터가 손실됩니다 (상황에 따라 괜찮을 수 있음).
한스 골드만

34

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

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

편집 : (의견에서 복사)

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

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

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

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

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


2
일부 텍스트 편집기는이 정보도 제공합니다. vim을 사용하면 :set fileencoding( 이 링크에서 ) 이것을 통해 얻을 수 있음을 알고 있습니다.
PaxRomana99

3
숭고한 텍스트-콘솔을 열고을 입력하십시오 view.encoding().
JimmidyJoo

또는 메모장으로 파일을 열 수 있습니다. '다른 이름으로 저장'을 사용하면 인코딩이 사용 된 드롭 다운 메뉴가 표시됩니다
don_Gunner94

9

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


내 문제의 경우 감사합니다
shahin gh

6

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 인코딩입니다. 모든 코드가 정의되므로 파일을 읽는 동안 오류가 발생하지 않으며, 오류가 마스킹되지 않으며, 문자가 유지됩니다 (손상되지 않은 채로 여전히 구별 가능).


1
와우 이것은 나에게 유일한 해독 작업입니다.
코왈 스키

1

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

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


1

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

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

Godspeed


물론입니다. 알 겠어. 시간 낭비가 없습니다. 감사합니다. 커피 나 좋은 와인을 원하십니까?
Pramesh Bajracharya

0

내 코드와 동일한 방식으로 Mysql 문자 인코딩을 변경하면 솔루션을 정렬하는 데 도움이되었습니다. `photo = open ( 'pic3.png', encoding = latin1), 강력한 텍스트 여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.