2016-07-22 11 views
4

Ich versuche, twitter Daten aus JSON-Datei mit Python 2,7.12 zu lesen. IchUnicodeDecodeError: 'utf8' Codec kann das Byte 0x80 in Position 3131 nicht entschlüsseln: ungültiges Startbyte

-Code verwendet wird, ist so:

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 

Ergebnis bekam ich:

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 

Ich ging durch alle Antworten von ähnlichen Problemen und kam mit diesem Code und es funktionierte beim letzten Mal. Ich habe keine Ahnung, warum es jetzt nicht funktioniert ... Ich würde jede Hilfe schätzen!

Antwort

9

Es hilft nicht, dass Sie sys.setdefaultencoding('utf-8') haben, die weiter verwirrend Dinge ist - es ist ein gemeiner Hack und Sie müssen es aus dem Code zu entfernen. Siehe https://stackoverflow.com/a/34378962/1554386 für weitere Informationen

Der Fehler passiert, weil line ein String ist und Sie anrufen encode(). encode() macht nur Sinn, wenn die Zeichenkette ein Unicode ist, also versucht Python, Unicode zuerst mit der Standardcodierung zu konvertieren, in Ihrem Fall ist dies UTF-8, sollte aber ASCII sein. So oder so, 0x80 ist nicht gültig ASCII oder UTF-8 so fehlschlägt.

0x80 ist in einigen Zeichensätzen gültig. In windows-1252/cp1252 ist es .

Der Trick hier ist, die Codierung Ihrer Daten den ganzen Weg durch Ihren Code zu verstehen. Im Moment überlässt du zu viel dem Zufall. Unicode String-Typen sind eine praktische Python-Funktion, mit der Sie codierte Strings dekodieren und die Codierung vergessen können, bis Sie die Daten schreiben oder übertragen müssen.

Verwenden Sie das Modul io, um die Datei im Textmodus zu öffnen und die Datei so zu dekodieren, wie sie geht - nicht mehr .decode()! Sie müssen sicherstellen, dass die Codierung Ihrer eingehenden Daten konsistent ist.Sie können es entweder extern neu codieren oder die Codierung in Ihrem Skript ändern. Hier habe ich die Codierung auf windows-1252 festgelegt.

Das io Modul bietet auch Universal Newlines. Das bedeutet, dass \r\n als Zeilenumbrüche erkannt werden, sodass Sie nicht auf sie achten müssen.

+0

Danke !!! Ich habe gerade versucht, aber es funktioniert nicht - ich versuche, "Windows-1252" zu ersetzen, wie ich Mac verwende. Ich habe 'latin-1' usw. versucht. Oder spielt es keine Rolle ...? Danke für die detaillierte Erklärung ... – wannabhappy

+0

Was ist der Fehler, den Sie jetzt haben? –

+0

Code läuft, aber ich bekomme "NULL" für alle Variablen in der Datenbank. Wenn ich jede JSON-Datei geöffnet und überprüft habe, gibt es Tweets in der Datei. Außerdem, als ich fragte, um die Anzahl der Tweets zu drucken, heißt es, ich habe 0 Tweets .... – wannabhappy

-2

Der Fehler tritt auf, wenn Sie versuchen, einen Tweet enthalten Satz wie

„@ Mike http zu lesen: \ www.google.com \ A8 & ^) ((&(), wie & ^% sind() (Sie ". Was nicht als String gelesen werden kann, sollten Sie es als rohe Zeichenfolge lesen. aber Konvertieren in Raw String Immer noch Fehler, so dass ich besser vorschlagen, Sie

lesen Sie eine JSON-Datei so etwas wie dies:

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

, die Sie erhalten die Daten laden von JSON-Datei.

Sie können es auch in einen CSV mit Pandas schreiben.

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

lesen dann aus csv die Codierung und Decodierung Problem diese Ihnen helfen,

Hoffnung vermeiden Sie Problem zu lösen.

Midhun

+1

Wovon redest du mit diesem "kann nicht als String gelesen werden" und "muss in rohen String konvertiert werden". In Python gibt es keine rohe Zeichenfolge. Es gibt eine rohe Zeichenkette _literals_, aber Sie können keine Laufzeitkonvertierungen zu denen ausführen, von denen ich hoffe, dass sie offensichtliche Gründe sind. –

+0

hey, als ich denselben Fehler beim Lesen der JSON-Datei bekam, war ich in der Lage, es durch obigen Code zu überwinden, weshalb ich es vorgeschlagen habe. Ich bin falsch, Sie sind immer willkommen, mich zu korrigieren. –

+0

@ MidhunMohan, Danke !! Ich habe mich auch auf deinen Code bezogen. – wannabhappy

3

In meinem Fall (Mac OS) gab es .DS_store-Datei in meinem Datenordner, die eine versteckte und automatisch generierte Datei war und es verursachte das Problem. Ich konnte das Problem beheben, nachdem ich es entfernt hatte.

Verwandte Themen