Codec UnicodeDecodeError: 'utf8' ne peut pas décoder byte 0x80 en position 3131: Byte de départ invalide
j'essaie de lire les données twitter du fichier json en utilisant python 2.7.12.
le Code que j'ai utilisé est tel:
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 != 'rn':
line = line.encode('ascii', 'ignore')
tweet = json.loads(line)
if u'info' not in tweet.keys():
tweets.append(tweet)
return tweets
résultat obtenu:
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
j'ai parcouru toutes les réponses de questions similaires et j'ai trouvé ce code et il a fonctionné la dernière fois. Je ne sais pas pourquoi ça ne marche pas maintenant...J'apprécierais toute aide!
3 réponses
cela n'aide pas que vous ayez sys.setdefaultencoding('utf-8')
, ce qui est encore plus déroutant - c'est un hack méchant et vous devez le retirer de votre code.
Voir https://stackoverflow.com/a/34378962/1554386 pour plus d'information
l'erreur se produit parce que line
est une chaîne de caractères et vous appelez encode()
. encode()
n'a de sens que si la chaîne est une Unicode, donc Python essaie de la convertir en Unicode en premier en utilisant la valeur par défaut encodage, qui dans votre cas est UTF-8
, mais devrait être ASCII
. Quoi qu'il en soit, 0x80
n'est pas valide ASCII ou UTF-8 donc échoue.
0x80
est valide dans certains jeux de caractères. Dans windows-1252
/ cp1252
c'est €
.
L'astuce ici est de comprendre l'encodage de vos données tout au long de votre code. En ce moment, tu laisses trop de place au hasard. Les types de chaîne de caractères Unicode sont une fonctionnalité Python pratique qui permet de décoder les Chaînes codées et oublier l'encodage jusqu'à ce que vous avez besoin d'écrire ou de transmettre les données.
utilisez le module io
pour ouvrir le fichier en mode texte et décoder le fichier au fur et à mesure - plus de .decode()
! Vous devez vous assurer que le cryptage de vos données entrantes est cohérent. Vous pouvez soit le réencoder extérieurement, soit modifier l'encodage de votre script. J'ai mis l'encodage à 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)
le module io
fournit également des lignes de nouvelles universelles. Cela signifie que \r\n
sont détectés comme newlines, de sorte que vous n'avez pas à les surveiller.
dans mon cas(Mac os), il y avait .DS_store fichier dans mon dossier de données qui était un fichier caché et généré automatiquement et il a causé le problème. J'ai été en mesure de résoudre le problème après l'avoir supprimé.
L'erreur se produit lorsque vous essayez de lire un tweet contenant phrase comme
"@Mike http:\www.google.com \A8&^)(( & () comment sont&^%()( vous ". Qui ne peut pas être lu comme une chaîne à la place vous êtes censé le lire comme une chaîne brute . mais convertir en chaîne brute donne toujours l'erreur donc je vous suggère de
lire un fichier json quelque chose comme ceci:
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"])
qui vous obtiendrez le charge de données du fichier json .
vous pouvez aussi l'écrire à un csv en utilisant Pandas.
import pandas as pd
output = pd.DataFrame( data={ "tweet":fulldata,"id":keys} )
output.to_csv( "tweets.csv", index=False, quoting=1 )
puis lire à partir de csv pour éviter le problème d'encodage et de décodage
espérons que cela vous aidera à résoudre votre problème.
Midhun