복붙노트

[PYTHON] UnicodeDecodeError : 'utf8'코덱은 0 위치의 바이트 0xa5을 디코딩 할 수 없습니다 : 잘못된 시작 바이트

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(​​__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 () 함수는 사전 {}을 반환합니다.

이 질문을 게시하기 전에 나는이 질문을 이렇게 언급했다.

다음 라인은 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. ==============================

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

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

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

    2.아래 코드를 사용해보십시오.

    아래 코드를 사용해보십시오.

  3. ==============================

    3.문자열에 비 ASCII 문자가 인코딩되어 있습니다.

    문자열에 비 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로 안전하게 인코딩 할 수 있습니다.

  4. ==============================

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

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

    인코딩 = '유니 코드 _ 에스케이프'

  5. ==============================

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

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

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

    6.다음 라인은 JSON 인코더를 해치는 것입니다.

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

    이것을 임시 수정으로 정확하게 표시하십시오 (확실하지 않습니다).

  7. ==============================

    7.2018-05 현재, 적어도 파이썬 3에서는 디코드로 직접 처리됩니다.

    2018-05 현재, 적어도 파이썬 3에서는 디코드로 직접 처리됩니다.

    유효하지 않은 시작 바이트 및 유효하지 않은 연속 바이트 유형 오류가 발생한 후 아래 스 니펫을 사용하고 있습니다. 오류 = '무시'를 추가하면 해결됩니다.

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

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

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

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

  9. ==============================

    9.aaronpenne 및 Soumyaansh에 의해 영감을 얻은

    aaronpenne 및 Soumyaansh에 의해 영감을 얻은

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

    10.일반적으로 말해서,

    일반적으로 말해서,

    잘못된 유형의 객체를 파일로 읽으려고하면 Python에서 이러한 오류가 발생합니다.

    e.

    file = open ( "xyz.pkl", "r")  텍스트 = file.read ()

    두 번째 줄은 위의 오류를 throw합니다.

    UnicodeDecodeError : 'utf-8'코덱은 0 위치의 바이트 0x80을 디코딩 할 수 없습니다 : 잘못된 시작 바이트

    유사한 방식으로 .npy를 읽는 것은 이런 종류의 오류를 던질 것입니다.

  11. ==============================

    11.필자의 경우, xslx excel 파일을 CSV (쉼표로 구분)로 저장하면 오류가 표시됩니다. 그러나 CSV (MS-DOS)로 저장할 때 오류가 발생하지 않습니다.

    필자의 경우, xslx excel 파일을 CSV (쉼표로 구분)로 저장하면 오류가 표시됩니다. 그러나 CSV (MS-DOS)로 저장할 때 오류가 발생하지 않습니다.

  12. ==============================

    12.HitHere, "GoogleNews-vectors-negative300.bin.gz"파일을 처음로드 한 다음 우분투에서이 명령으로 추출해야합니다 : gunzip -k GoogleNews-vectors-negative300.bin.gz. [수동 추출은 절대로 권장되지 않습니다.]

    HitHere, "GoogleNews-vectors-negative300.bin.gz"파일을 처음로드 한 다음 우분투에서이 명령으로 추출해야합니다 : gunzip -k GoogleNews-vectors-negative300.bin.gz. [수동 추출은 절대로 권장되지 않습니다.]

    둘째, python 3에서 다음 명령을 적용해야합니다.

    import gensim
    model = gensim.models.Word2Vec.load_word2vec_format('./model/GoogleNews-vectors-negative300.bin', binary=True)
    

    유용하게 사용되기를 바랍니다.

  13. from https://stackoverflow.com/questions/22216076/unicodedecodeerror-utf8-codec-cant-decode-byte-0xa5-in-position-0-invalid-s by cc-by-sa and MIT license