UnicodeDecodeError : 'utf8'코덱이 위치 0에서 바이트 0xa5를 디코딩 할 수 없습니다 : 유효하지 않은 시작 바이트


188

Python-2.6 CGI스크립트를 사용하고 있지만 서버 로그에서이 오류를 발견했습니다 json.dumps().

Traceback (most recent call last):
  File "/etc/mongodb/server/cgi-bin/getstats.py", line 135, in <module>
    print json.dumps(​​__getdata())
  File "/usr/lib/python2.7/json/__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "/usr/lib/python2.7/json/encoder.py", line 201, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python2.7/json/encoder.py", line 264, in iterencode
    return _iterencode(o, 0)
UnicodeDecodeError: 'utf8' codec can't decode byte 0xa5 in position 0: invalid start byte

여기,

​__get​data()함수는를 반환합니다 dictionary {}.

이 질문을 게시하기 전에 나는 질문 os SO에 대해 언급 했습니다 .


업데이트

다음 줄은 JSON 인코더를 손상시킵니다.

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit

임시 수정 사항이 있습니다.

print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })

그러나 올바른 방법인지 확실하지 않습니다.


1
사전에 인코딩 / 디코딩 할 수없는 문자열 데이터가있는 것 같습니다. 무엇입니까 dict?
mgilson

@ mgilson yup master 문제를 이해했지만 처리 방법을 dictlist, dict, python timestamp value
모르겠습니다

1
@ 파일럿-실제로는 아닙니다. 실제 문제는에 어딘가에 묻혀 __getdata있습니다. 당신이 결정 불가능한 캐릭터를 얻는 지 모르겠습니다 . dict에 패치를 만들어서 작동시킬 수는 있지만 나중에 더 많은 문제를 요구합니다. 비 ASCII 문자가 어디에 있는지 알기 위해 dict을 인쇄하려고합니다. 그런 다음 해당 필드의 계산 / 설정 방법을 파악한 후 뒤로 작업하십시오.
mgilson


1
ASCII가 아닌 문자가 포함 된 .csv 파일을 읽으려고 할 때도 동일한 오류가 발생했습니다. 해당 문자를 제거하면 (아래 제안) 문제가 해결되었습니다.
Dmitriy R. Starson 3

답변:


87

오류는 사전에 ASCII가 아닌 문자가 있기 때문에 인코딩 / 디코딩 할 수 없기 때문입니다. 이 오류를 피하는 간단한 방법 encode()은 다음과 같은 함수 를 사용하여 이러한 문자열을 인코딩하는 것 a입니다 (비 ASCII 문자가있는 문자열 인 경우 ).

a.encode('utf-8').strip()

2
UTF-8은 oldschool 7 비트 ASCII와 역 호환되므로 모든 것을 인코딩해야합니다. 7 비트 ASCII 범위의 문자의 경우이 인코딩은 아이디 매핑입니다.
Tadeusz A. Kadłubowski

29
이것은 분명하지 않습니다. CSV 파일을 가져올 때이 코드를 어떻게 사용합니까?
Dave

sqlalchemy 쿼리를 실행할 때 동일한 문제가 나타납니다. 쿼리를 어떻게 인코딩합니까 (문자열이 아니기 때문에 .encode가 없음)?
c8999c 3f964f64

129

read_csv()명령 에서 다른 코덱 패키지를 정의하여 간단히 전환했습니다 .

encoding = 'unicode_escape'

예 :

import pandas as pd
data = pd.read_csv(filename, encoding= 'unicode_escape')

1
다음을 사용하는 경우에만pandas
Valeriy

1
죄송합니다. 작동하지 않습니다. 다시 같은 오류가 발생했습니다. 하지만 내가 사용할 때 ( 'filename.csv', engine = 'python'). 이것은 효과가 있었다.
basavaraj_S

117

아래 코드 스 니펫을 사용해보십시오.

with open(path, 'rb') as f:
  text = f.read()

7
나는 r대신에했다 rb. 알림을 추가해 주셔서 감사합니다 b!
Paul

1
기본적으로 open기능에는 읽기 전용 모드로 'r'이 있습니다. rb읽기 이진 모드를 나타냅니다.
시바

39

문자열에 ascii문자 가 아닌 문자가 인코딩되어 있습니다.

utf-8코드에서 다른 인코딩을 사용해야하는 경우 디코딩 이 불가능할 수 있습니다. 예를 들면 다음과 같습니다.

>>> 'my weird character \x96'.decode('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeDecodeError: 'utf8' codec can't decode byte 0x96 in position 19: invalid start byte

이 경우 인코딩이 수행 windows-1252되므로 다음을 수행해야합니다.

>>> 'my weird character \x96'.decode('windows-1252')
u'my weird character \u2013'

이제 당신이 가지고 Unicode안전하게으로 인코딩 할 수 있습니다 utf-8.


1
예상치 못한 "미스터리 바이트"의 인코딩을 설정하는 데 도움이되는 간단한 페이지를 만들었습니다. tripleee.github.io/8bit
tripleee

34

read csv에서 인코딩 방법을 추가했습니다.

import pandas as pd
dataset = pd.read_csv('sample_data.csv', header= 0,
                        encoding= 'unicode_escape')

16

코드 상단에 기본 인코더 설정

import sys
reload(sys)
sys.setdefaultencoding("ISO-8859-1")

python3에는 sys 모듈에서 setdefaultencoding이 설정되어 있지 않습니다!
Anwar Hossain

14

2018-05 현재 이것은 decode적어도 Python 3의 경우 직접 처리됩니다 .

아래 스 니펫 invalid start byteinvalid continuation byte유형 오류 를 사용하고 있습니다. 추가 errors='ignore'하여 나를 위해 수정했습니다.

with open(out_file, 'rb') as f:
    for line in f:
        print(line.decode(errors='ignore'))

1
물론 이것은 정보를 자동으로 버립니다. 훨씬 더 나은 해결책은 무엇이 있어야하는지 파악하고 원래 문제를 해결하는 것입니다.
트리플 리

14

@aaronpenne과 @Soumyaansh에서 영감을 얻었습니다.

f = open("file.txt", "rb")
text = f.read().decode(errors='replace')

"AttributeError : 'str'개체에 'decode'특성이 없습니다." 무엇이 잘못되었는지 확실하지 않습니까?
Victor Wong

"rb"에 b를 포함 시켰습니까? b는 파일을 바이트 형식으로 여는 데 사용됩니다. r 만 사용하면 문자열이며 디코드를 포함하지 않습니다.
Punnerud

14

이 솔루션은 저에게 효과적이었습니다.

import pandas as pd
data = pd.read_csv("training.csv", encoding = 'unicode_escape')

11

간단한 해결책 :

import pandas as pd
df = pd.read_csv('file_name.csv', engine='python')

3
도움을 주셔서 감사합니다!
Ruben

@Ruben
Gil Baggio

2
감사합니다. 나는 판다에서 일하고 있었다. 다시 한번 감사드립니다
basavaraj_S

@basavaraj_S를 도와 드리겠습니다
Gil Baggio

1
여기에 제시된 모든 것 중 나에게 적합한 유일한 솔루션입니다.
lunesco

7

다음 줄은 JSON 인코더를 손상시킵니다.

now = datetime.datetime.now()
now = datetime.datetime.strftime(now, '%Y-%m-%dT%H:%M:%S.%fZ')
print json.dumps({'current_time': now}) // this is the culprit

임시 수정 사항이 있습니다.

print json.dumps( {'old_time': now.encode('ISO-8859-1').strip() })

이를 임시 수정 사항으로 올바른 것으로 표시하십시오 (확실하지 않음).


5

위의 방법으로 문제가 해결되지 않으면 csv 파일 자체의 인코딩을 변경하는 것이 좋습니다.

엑셀 사용하기 :

  1. Excel을 사용하여 CSV 파일 열기
  2. "파일 메뉴"옵션으로 이동하여 "다른 이름으로 저장"을 클릭하십시오
  3. "찾아보기"를 클릭하여 파일을 저장할 위치를 선택하십시오
  4. 의도 한 파일 이름을 입력하십시오
  5. CSV (쉼표로 구분) (*. csv) 옵션 선택
  6. "도구"드롭 다운 상자를 클릭하고 "웹 옵션"을 클릭하십시오.
  7. "인코딩"탭의 "다른 이름으로 문서 저장"드롭 다운 목록에서 유니 코드 (UTF-8) 옵션을 선택하십시오.
  8. 파일을 저장하십시오

메모장 사용하기 :

  1. 메모장을 사용하여 CSV 파일 열기
  2. "파일"> "다른 이름으로 저장"옵션으로 이동하십시오
  3. 다음으로 파일 위치를 선택하십시오
  4. 파일 형식 옵션을 모든 파일 ( ) 로 선택하십시오 .
  5. 확장자가 .csv 인 파일 이름을 지정하십시오.
  6. "인코딩"드롭 다운 목록에서 UTF-8 옵션을 선택하십시오.
  7. 저장을 클릭하여 파일을 저장하십시오.

이렇게하면 UnicodeCodeError가 발생하지 않고 csv 파일을 가져올 수 있어야합니다.


2

앞에서 설명한 해결 방법을 모두 시도한 후에도 여전히 같은 오류가 발생하면 파일을 CSV로 내보내십시오 (이미 있으면 두 번째). 특히 scikit learn을 사용하는 경우 데이터 세트를 CSV 파일로 가져 오는 것이 가장 좋습니다.

해결책은이 간단한 반면 몇 시간을 함께 보냈습니다. 파일을 CSV로 Anaconda 또는 분류 도구가 설치된 디렉토리로 내보내고 시도하십시오.


2

특정 사용 및 입력의 표준 인코딩을 사용할 수 있습니다.

utf-8 기본값입니다.

iso8859-1 서유럽에도 인기가 있습니다.

예 : bytes_obj.decode('iso8859-1')

참조 : 문서


1
맹목적으로 인코딩을 추측하면 더 많은 오류가 발생할 수 있습니다. 파일에서 어떤 인코딩을 사용하는지 실제로 알지 못하고 iso8859-1 또는 cp1251 등을 선택하면 증상이 제거되지만 잘못 추측하면 가비지가 발생합니다. 몇 바이트에 불과한 경우 실제 오류를 확인 하고 수정하는 데 몇 년이 걸릴 수 있습니다 .
tripleee

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