web-dev-qa-db-fra.com

UnicodeDecodeError: le codec 'utf8' ne peut pas décoder l'octet 0x80 en position 3131: octet de début 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 != '\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

J'ai parcouru toutes les réponses de problèmes similaires et j'ai trouvé ce code et cela a fonctionné la dernière fois. Je n'ai aucune idée pourquoi cela ne fonctionne pas maintenant ... J'apprécierais toute aide!

9
wannabhappy

Cela n'aide pas que vous ayez sys.setdefaultencoding('utf-8'), ce qui rend les choses encore plus confuses - C'est un hack méchant et vous devez le supprimer de votre code. Voir https://stackoverflow.com/a/34378962/1554386 pour plus d'informations

L'erreur se produit car line est une chaîne et vous appelez encode(). encode() n'a de sens que si la chaîne est un Unicode, donc Python essaie de le convertir en Unicode d'abord en utilisant l'encodage par défaut, qui dans votre cas est UTF-8 , mais devrait être ASCII. Dans les deux cas, 0x80 n'est pas valide ASCII ou UTF-8 échoue donc.

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. Pour le moment, vous laissez trop de place au hasard. Les types de chaînes Unicode sont une fonction pratique Python qui vous permet de décoder les chaînes codées et d'oublier l'encodage jusqu'à ce que vous ayez 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 .decode()! Vous devez vous assurer que le codage de vos données entrantes est cohérent. Vous pouvez soit le ré-encoder en externe, soit changer l'encodage dans votre script. Voici que j'ai défini l'encodage sur 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 sauts de ligne universels. Cela signifie que \r\n Sont détectés en tant que nouvelles lignes, vous n'avez donc pas à les surveiller.

12
Alastair McCormack

Dans mon cas (mac os), il y avait un fichier .DS_store dans mon dossier de données qui était un fichier caché et généré automatiquement et cela a causé le problème. J'ai pu résoudre le problème après l'avoir supprimé.

27
Sung-Ho_Ahn