UnicodeDecodeError: ‘utf8’ codec non può decodificare byte 0x80 in posizione 3131: invalid start byte

Sto cercando di leggere twitter i dati da file json utilizzando python 2.7.12.

Codice che ho usato è:

    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

Risultato che ho ottenuto:

    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

Sono andato attraverso tutte le risposte da problemi simili e si avvicinò con questo codice e ha funzionato l’ultima volta. Non ho idea perché non funziona ora…gradirei qualsiasi aiuto!

OriginaleL’autore wannabhappy | 2016-07-22

3 Replies
  1. 11

    Non aiuta il fatto che hai sys.setdefaultencoding('utf-8'), che è confuso ulteriormente le cose – È un brutto hack e che è necessario rimuovere dal vostro codice.
    Vedere https://stackoverflow.com/a/34378962/1554386 per ulteriori informazioni

    L’errore sta accadendo perché line è una stringa che si sta chiamando encode(). encode() ha senso solo se la stringa Unicode, in modo da Python tenta di convertirlo Unicode utilizzando la codifica di default, che nel tuo caso è UTF-8, ma dovrebbe essere ASCII. In ogni modo, 0x80 non è valido ASCII o UTF-8 in modo negativo.

    0x80 è valido in alcuni set di caratteri. In windows-1252/cp1252 è .

    Qui il trucco è quello di capire la codifica dei dati di tutto il percorso attraverso il vostro codice. Al momento, si sta lasciando troppo al caso. Stringa Unicode tipi sono un’utile funzione Python che permette la decodifica delle Stringhe codificate e dimenticare la codifica fino a quando è necessario scrivere o trasmettere i dati stessi.

    Utilizzare il io modulo per aprire il file in modalità testo e decodificare il file come va, non di più .decode()! È necessario assicurarsi che la registrazione dei vostri dati in entrata è coerente. È possibile ri-codificare esternamente o modificare la codifica nel tuo script. Ecco io ho impostato la codifica 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)

    Il io modulo anche fornire Universale punto e a capo. Questo significa \r\n sono rilevati come punto e a capo, in modo da non dovete guardare per loro.

    Grazie!!! Ho appena provato ma non funziona, sto cercando di sostituire il “windows-1252” come sto usando il mac. Ho cercato di ‘latin-1’ ecc. O non importa…? Grazie per la spiegazione dei dettagli…
    Qual è l’errore che stanno facendo adesso?
    Il codice funziona ma mi da “NULL” per tutte le variabili nel database. Quando ho aperto ogni file json e controllato, non ci sono tweet di file. Inoltre, quando ho chiesto di stampa numero di tweet, si dice che ho 0 tweet….
    Si sta andando ad avere bisogno di eseguire il debug del codice e ho scoperto che non funziona. Sembra che la mia soluzione ha funzionato, ma hai perso qualcosa. Cosa succede se si print tweet nel ciclo for?
    Ok. Sto cercando di eseguire il debug di codice…È per me un elenco vuoto cioè [ ]. Grazie mille!!

    OriginaleL’autore

  2. 17

    Nel mio caso(mac os), non c’era .DS_store file nella mia cartella di dati che è stato nascosto e automaticamente generato il file e ha causato il problema. Sono stato in grado di risolvere il problema dopo la rimozione.

    Grazie Cantato! era lo stesso problema, per me, su Mac OS, ho ignorato il file in codice alla fine, dal momento che sarà ri-generati dal sistema operativo e non ero sicuro di come sicuro sarà per rimuovere in modo permanente…

    OriginaleL’autore

  3. -2

    L’errore si verifica quando si tenta di leggere un tweet contenente frase come

    “@Mike http:\www.google.com \A8&^)((&() come sono&^%()( si “. Che non può essere letto come una Stringa, invece, si supponga per leggere, come materia prima Stringa .
    ma la Conversione di raw Stringa dà Ancora errore, così ho meglio, ti consiglio di

    leggere un file json qualcosa di simile a questo:

    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"])

    che consente di ottenere il carico di dati da un file json .

    Si può anche scrivere in un file csv utilizzando i Panda.

    import pandas as pd
    output = pd.DataFrame( data={ "tweet":fulldata,"id":keys} )
    output.to_csv( "tweets.csv", index=False, quoting=1 )

    Quindi leggere da file csv per evitare la codifica e decodifica di problema

    spero che questo vi aiuterà a risolvere il problema.

    Midhun

    Di cosa stai parlando, con questo “non può essere letto come una stringa” e “deve essere convertito in raw stringa”. Non c’è nessuna tale cosa come un raw stringa in Python. Ci sono materie stringa valori letterali, ma non si può fare qualsiasi runtime conversioni a quelli per i quali spero siano ovvi motivi.
    ehi, quando ho avuto lo stesso errore durante la lettura del file json sono stato in grado di superare dal codice di cui sopra è per questo che ho suggerito .Mi sono sbagliato, sei sempre il benvenuto per correggere me.
    Grazie!! Ho fatto riferimento al tuo codice.
    Fatto il lavoro per voi
    No….non ancora..ho cambiato il codice in quanto tale, come mi è stato po ‘ confuso che cosa si intende per “tweet” e “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)/

    OriginaleL’autore

Lascia un commento