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!

4
demandé sur wannabhappy 2016-07-22 07:11:42

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.

11
répondu Alastair McCormack 2017-05-23 10:31:30

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é.

16
répondu Sung-Ho_Ahn 2017-10-17 09:29:22

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

-2
répondu Midhun Mohan 2016-07-22 07:10:37