2017-09-11 12 views
-1

Ich erhalte Daten von Twitter im JSON-Format und speichere diese in einer Datei.TypeError: ein Byte-ähnliches Objekt wird benötigt, nicht 'str' - JSON-Daten in Python speichern

consumer_key = 'Consumer KEY' 
consumer_secret = 'Secret' 
access_token = 'Token' 
access_secret = 'Access Secret' 

auth = OAuthHandler(consumer_key, consumer_secret) 

auth.set_access_token(access_token, access_secret) 

api = tweepy.API(auth) 

os.chdir('Path') 
file = open('TwData.json','wb') 

for status in tweepy.Cursor(api.home_timeline).items(15): 
    simplejson.dump(status._json,file,sort_keys = True) 
file.close 

Aber ich bin die unten stehende Störung zu erhalten:

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
    File "/Users/abc/anaconda/lib/python3.6/json/__init__.py", line 180, in dump 
    fp.write(chunk) 
TypeError: a bytes-like object is required, not 'str' 
+0

Dieser Code kann diesen Fehler –

+1

@GhilasBELHADJ nicht erzeugen: sicher kann es. –

+0

Warum haben Sie die Datei im Binärmodus geöffnet? Sie rufen auch nicht wirklich die 'file.close()' Methode auf, diese Zeile ist ziemlich redundant wie sie ist. –

Antwort

1

Vom json.dump() documentation:

The json module always produces str objects, not bytes objects. Therefore, fp.write() must support str input.

Sie öffnete die Datei im Binärmodus. Tu das nicht, entfernen Sie die b aus dem Datei-Modus:

file = open('TwData.json','w') 

Es ist besser, einen absoluten Pfad zu verwenden, anstatt das Arbeitsverzeichnis zu ändern, und wenn Sie die Datei als Kontext-Manager verwendet (mit der with Aussage), wird es automatisch für Sie geschlossen, wenn der Block fertig ist. Das hilft Fehler zu vermeiden, wie vergessen, die file.close() Methode tatsächlich aufzurufen.

Und wenn Sie mehr JSON Dokumente in die Datei zu schreiben, zumindest legte eine Newline zwischen jedem Dokument zu gehen, ist es macht ein JSON lines file; dies ist much easier to parse again später:

with open('Path/TWData.json', 'w') as file:  
    for status in tweepy.Cursor(api.home_timeline).items(15): 
     json.dump(status._json, file, sort_keys=True) 
     file.write('\n') 

Alternativ alles in einem Top-Level-Objekt wie Abbildung oder Liste gesetzt, und schreiben, dass einzelne Objekt in die Datei ein gültiges JSON-Dokument zu erstellen.

1

Nicht Speicher getrennte json Objekte. Fügen Sie jeden einzelnen zu einer Liste hinzu, und entladen Sie dann sofort.

with open('TwData.json','w') as file:  
    data = [] 
    for status in tweepy.Cursor(api.home_timeline).items(15): 
     data.append(status._json) 

    simplejson.dump(data, file, sort_keys=True) 

Sollte auch hier beachten Sie, dass Sie die Datei nicht im Binär-Modus geöffnet werden soll, wenn Sie Text, um ihn zu schreiben.

+0

sehr nützlich ... schätzen es –

+0

mein Schlechter, war ich nicht bewusst, dass .. wollte beide akzeptieren, aber da ich Martjin früher akzeptiert hatte, es mich nicht akzeptieren, deins..still beide sind gleichermaßen nützlich für mich .. –

+1

@RiteshSatapathy Ich sage dir nicht, ob du es tun sollst oder nicht, aber für eine zukünftige Bezugnahme musst du zuerst eine Antwort inakzeptabel machen, um eine andere anzunehmen. Klicken Sie also auf den grünen Haken, um den Haken wieder zu entfernen. Lesen Sie: https://stackoverflow.com/help/someone-answers 'Sie können jederzeit ändern, welche Antwort akzeptiert wird, oder einfach die Antwort jederzeit ablehnen.' –

Verwandte Themen