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 기능입니다.
를 사용합니다.io
module을 사용하여 파일을 텍스트 모드로 열고 파일을 디코딩합니다(더 이상)..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
'programing' 카테고리의 다른 글
React의 useState() 훅을 사용하여 컴포넌트 간에 상태를 공유할 수 있습니까? (0) | 2023.02.26 |
---|---|
jQuery를 사용하여 ajax 요청을 큐잉합니다.큐() (0) | 2023.02.26 |
Oracle Connection URL 기본 스키마 (0) | 2023.02.26 |
JSON 문자열을 탈출하는 방법 (0) | 2023.02.26 |
Woocommerce에서 쿠폰을 프로그래밍 방식으로 적용합니다. (0) | 2023.02.26 |