2017-09-11 7 views
-1

Twitterのデータをjson形式で取得してファイルに保存しています。TypeError: 'str'ではなくバイトのようなオブジェクトが必要です - PythonでJSONデータを保存する

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 

しかし、私は以下のエラーを取得しています:

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

このコードはこのエラーを生成できません。 –

+1

@GhilasBELHADJ:できることを確認してください。 –

+0

なぜバイナリモードでファイルを開いたのですか?実際には、 'file.close()'メソッドを呼び出すのではなく、その行はそれほど冗長ではありません。 –

答えて

1

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

あなたはバイナリモードでファイルを開きました。それをしないでください、ファイルモードからbを削除します。それは、絶対パスを使用するのではなく、作業ディレクトリを変更する方が良いでしょう

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

、あなたはwith文で(コンテキストマネージャとしてファイルを使用した場合)、ブロックが完了すると自動的に閉じられます。これにより、実際にfile.close()メソッドを呼び出すことを忘れるなどのエラーを回避できます。

複数のJSONドキュメントをファイルに書き込む場合、各ドキュメントの間に少なくとも改行を入れて、JSON lines fileにします。これはmuch easier to parse again後である:

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') 

はまた、マッピングまたはリストなどのトップレベルのオブジェクトにすべてを入れて、ファイルへ単一オブジェクトが有効なJSON文書を作成することを書きます。

1

はない店舗別のJSONオブジェクトを行います。それぞれをリストに追加し、一度にダンプします。

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) 

テキストを書き込む場合は、バイナリモードでファイルを開くべきではないことに注意してください。 json.dump() documentationから

+0

非常に便利です。それを褒めます –

+0

私はそれについて気づいていませんでした。これらの両方を受け入れることを望んでいましたが、私はMartjin'sを受け入れて以来、私はあなたを受け入れることができません。 –

+1

@RiteshSatapathy私はあなたにそれをするかどうかは言いませんが、将来参照するには、まず別のものを受け入れる答えを受け入れないようにする必要があります。緑色のチェックをクリックしてもう一度チェックを外してください。お読みください:https://stackoverflow.com/help/someone-answers 'あなたはどの回答が受け入れられるかを変更することも、単に回答を受け入れないこともできます。 –

関連する問題