UnicodeDecodeError: 'utf8' codec ne peut pas décoder les octets 0x80 en position 3131: invalid octet de départ
Je suis en train de lire les données de twitter à partir du fichier json à l'aide de python 2.7.12.
Code que j'ai utilisé est:
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
Résultat que j'ai 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
Je suis passé par toutes les réponses à partir des questions similaires et est venu avec ce code et cela a fonctionné la dernière fois. Je n'ai aucune idée de pourquoi il ne fonctionne pas maintenant...je vous serais reconnaissant de toute aide!
OriginalL'auteur wannabhappy | 2016-07-22
Vous devez vous connecter pour publier un commentaire.
Cela n'aide pas que vous avez
sys.setdefaultencoding('utf-8')
, ce qui est source de confusion encore plus les choses - C'est un vilain hack et vous avez besoin de supprimer à partir de votre code.Voir https://stackoverflow.com/a/34378962/1554386 pour plus d'informations
L'erreur se produit parce que les
line
est une chaîne et que vous êtes d'appelencode()
.encode()
n'a de sens que si la chaîne est un Unicode, donc Python essaie de convertir en Unicode en utilisant d'abord le codage par défaut, ce qui dans votre cas estUTF-8
, mais devrait êtreASCII
. De toute façon,0x80
n'est pas valide ASCII ou UTF-8, il ne parvient pas.0x80
est valable dans certains ensembles de caractères. Danswindows-1252
/cp1252
c'est€
.L'astuce ici est de comprendre l'encodage de vos données tout au long de votre code. Pour le moment, vous êtes en laissant trop de place à la chance. Chaîne Unicode types de sont une pratique fonction Python 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.
Utiliser le
io
module pour ouvrir le fichier en mode texte et de décoder le fichier tel qu'il va, plus.decode()
! Vous devez vous assurer que le cryptage de vos données entrantes est cohérent. Vous pouvez ré-encoder de l'extérieur ou de changer l'encodage dans votre script. Voilà j'ai mis l'encodage dewindows-1252
.La
io
module Universal retours à la ligne. Cela signifie\r\n
sont détectés comme des retours à la ligne, de sorte que vous n'avez pas à regarder pour eux.Quelle est l'erreur que vous avez maintenant?
Le Code fonctionne, mais j'obtiens un "NULL" pour toutes les variables dans la base de données. Quand j'ai ouvert chaque fichier json et vérifié, il y a des tweets dans le fichier. Aussi, quand j'ai demandé d'imprimer le nombre de tweets, il dit que j'ai 0 tweets....
Vous allez avoir besoin de déboguer votre code et a découvert ce qui ne fonctionne pas. Il sonne comme ma solution a fonctionné, mais vous avez raté quelque chose. Qu'advient-il si vous
print tweet
dans votre boucle for?Ok. Je suis en train de déboguer le code...Il me donne la liste vide c'est à dire
[ ]
. Merci beaucoup!!OriginalL'auteur Alastair McCormack
Dans mon cas(mac os), il y avait .DS_store fichier dans mon dossier de données qui a été caché et génération automatique d'un fichier et il est la cause du problème. J'ai été en mesure de résoudre le problème après l'avoir supprimé.
oui! merci!!!! j'ai simplement ajouté une instruction if pour lire seulement .les fichiers txt et elle fonctionne
même ici. Merci!
OriginalL'auteur Sung-Ho_Ahn
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 de caractères, au contraire, vous supposez que de le lire en tant que Chaîne brute .
mais la Conversion de raw Chaîne donne une erreur donc j'ai mieux, je vous suggère de
lire un fichier json à quelque chose comme ceci:
qui permettra d'obtenir le chargement des données à partir du fichier json .
Vous pouvez aussi écrire sur un fichier csv à l'aide de Pandas.
Puis lire à partir de csv pour éviter l'encodage et le décodage problème
espère que cela va vous aider à résoudre votre problème.
Midhun
hey quand j'ai eu la même erreur lors de la lecture du fichier json, j'ai été en mesure de le surmonter par le code ci-dessus, c'est pourquoi je l'ai proposé .Je me trompe, vous êtes toujours les bienvenus à me corriger.
Merci!!!!! J'ai appelé votre code.
Ca a marché pour vous
Non....pas encore..j'ai changé votre code en tant que tel, comme je l'ai été peu confus ce que vous entendez par "tweet" et "id".
with codecs.open(file_name,'rU','utf-8') as twitter_file:/ for line in twitter_file:/ tweet = json.loads(line)/ print line/ if u'info' not in tweet.keys():/ tweets.append(tweet)/
OriginalL'auteur Midhun Mohan