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

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() })

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



답변

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

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


답변

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

encoding = 'unicode_escape'

예 :

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


답변

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

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


답변

문자열에 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.


답변

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

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


답변

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

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


답변

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'))