IT

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

lottoking 2020. 7. 10. 07:47
반응형

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(​​__get​data())
  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()

아래 코드 스 니펫을 사용합니다.

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

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

encoding = 'unicode_escape'

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'

이제 유니 코드가 있으므로 utf-8로 인코딩 할 수 있습니다.


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

aaronpenne과 Soumyaansh에서 영감을 받음

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

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

다음 줄은 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() })

이를 임시 수정으로 올바른 명령 표시 (확실하지 않음).


위의 방법이 작동하지 않는 경우 csv 파일 자체의 인코딩을 변경하는 것이 좋습니다.

Excel 사용 :

  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 파일을 수 있습니다.


앞서 언급 한 한 모든 해결 방법을 시도한 후에도 계속 오류가 계속 발생하면 파일을 CSV로 두 번째 발생합니다. 특히 scikit 학습을 사용하는 경우 데이터 세트를 CSV 파일로 가져 오는 것이 가장 좋습니다.

몇 시간을 함께 보냈지 만 해결은 이렇게 간단했습니다. Anaconda 또는 분류기 도구가 일련의 파일을 CSV로 시도하십시오.

참고 URL : https://stackoverflow.com/questions/22216076/unicodedecodeerror-utf8-codec-cant-decode-byte-0xa5-in-position-0-invalid-s

반응형