programing

UnicodeDecodeError: 'utf8' 코덱이 위치 3131에서 바이트 0x80을 디코딩할 수 없음: 잘못된 시작 바이트

lastmoon 2023. 2. 26. 10:26
반응형

UnicodeDecodeError: 'utf8' 코덱이 위치 3131에서 바이트 0x80을 디코딩할 수 없음: 잘못된 시작 바이트

python 2.7.12를 사용하여 json 파일에서 twitter 데이터를 읽으려고 합니다.

사용한 코드는 다음과 같습니다.

    import json
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    def get_tweets_from_file(file_name):
        tweets = []
        with open(file_name, 'rw') as twitter_file:
            for line in twitter_file:
                if line != '\r\n':
                    line = line.encode('ascii', 'ignore')
                    tweet = json.loads(line)
                    if u'info' not in tweet.keys():
                        tweets.append(tweet)
    return tweets

얻은 결과:

    Traceback (most recent call last):
      File "twitter_project.py", line 100, in <module>
        main()                  
      File "twitter_project.py", line 95, in main
        tweets = get_tweets_from_dir(src_dir, dest_dir)
      File "twitter_project.py", line 59, in get_tweets_from_dir
        new_tweets = get_tweets_from_file(file_name)
      File "twitter_project.py", line 71, in get_tweets_from_file
        line = line.encode('ascii', 'ignore')
    UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 3131: invalid start byte

비슷한 문제에 대한 답을 모두 검토해서 이 코드를 생각해 냈는데 지난번에 작동했어요.왜 지금 작동이 안 되는지 모르겠어요.

내 경우(mac os)가 있었다.데이터 폴더에 있는 DS_store 파일이 숨겨져 있고 자동으로 생성된 파일이어서 문제가 발생하였습니다.제거 후 문제를 해결할 수 있었습니다.

당신이 가지고 있는 것은 도움이 되지 않는다.sys.setdefaultencoding('utf-8')더 혼란스러운 것은 - 그것은 고약한 해킹이고 당신은 당신의 코드에서 그것을 삭제해야 한다는 것입니다.상세한 것에 대하여는, https://stackoverflow.com/a/34378962/1554386 를 참조해 주세요.

에러가 발생하고 있는 것은,line스트링으로 전화를 걸면encode().encode()문자열이 Unicode일 경우에만 의미가 있기 때문에 Python은 기본 인코딩을 사용하여 Unicode를 먼저 변환하려고 합니다.이 경우 다음과 같습니다.UTF-8단, 다음과 같이 해야 합니다.ASCII.어느 쪽이든,0x80는 유효한 ASCII 또는 UTF-8이 아니기 때문에 실패합니다.

0x80는 일부 문자 집합에서 유효합니다.windows-1252/cp1252그건….

여기서의 요령은 코드를 통해 데이터의 인코딩을 이해하는 것입니다.지금은 운에 맡기는 게 너무 많아Unicode String 유형은 인코딩된 문자열을 디코딩하고 데이터를 쓰거나 전송할 때까지 인코딩을 잊어버릴 수 있는 편리한 Python 기능입니다.

를 사용합니다.iomodule을 사용하여 파일을 텍스트 모드로 열고 파일을 디코딩합니다(더 이상)..decode()! 착신 데이터의 부호화가 일치하고 있는 것을 확인할 필요가 있습니다.외부에서 다시 인코딩하거나 스크립트에서 인코딩을 변경할 수 있습니다.부호화를 다음과 같이 설정했습니다.windows-1252.

with io.open(file_name, 'r', encoding='windows-1252') as twitter_file:
    for line in twitter_file:
        # line is now a <type 'unicode'>
        tweet = json.loads(line)

io모듈에는 유니버설뉴라인도 준비되어 있습니다.즉,\r\n새로운 라인으로 검출되기 때문에 지켜볼 필요가 없습니다.

오류 메시지로 인해 이 질문을 받은 다른 사용자에게는 이진 모드가 아닌 텍스트 모드로 파일을 열었을 때 피클 파일을 열려고 할 때 이 오류가 발생했습니다.

원래 코드는 다음과 같습니다.

import pickle as pkl
with open(pkl_path, 'r') as f:
    obj = pkl.load(f)

이것으로 오류가 수정되었습니다.

import pickle as pkl
with open(pkl_path, 'rb') as f:
    obj = pkl.load(f)

실수로 parquet 파일을 csv로 읽으려다 비슷한 오류가 발생했습니다.

pd.read_csv(file.parquet)

pd.read_parquet(file.parquet)

다음과 같은 문장이 포함된 트윗을 읽으려고 하면 오류가 발생합니다.

"@Mike http:\www.google.com \A8&^"(&) "안녕하십니까?" (")이것은 스트링으로 읽을 수 없습니다만, raw String으로 변환해도 에러가 발생하므로, 다음을 권장합니다.

다음과 같은 json 파일을 읽습니다.

import codecs
import json
    with codecs.open('tweetfile','rU','utf-8') as f:
             for line in f:
                data=json.loads(line)
                print data["tweet"]
keys.append(data["id"])
            fulldata.append(data["tweet"])

json 파일에서 데이터 로드를 가져옵니다.

팬더를 사용하여 csv에 쓸 수도 있습니다.

import pandas as pd
output = pd.DataFrame( data={ "tweet":fulldata,"id":keys} )
output.to_csv( "tweets.csv", index=False, quoting=1 )

그런 다음 csv에서 읽어 인코딩 및 디코딩 문제를 방지합니다.

이것이 당신의 문제를 해결하는 데 도움이 되기를 바랍니다.

미훈

언급URL : https://stackoverflow.com/questions/38518023/unicodedecodeerror-utf8-codec-cant-decode-byte-0x80-in-position-3131-invali

반응형