質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

823閲覧

Twitter APIから取得したテキストデータをファイルに書き込みたい

farinelli

総合スコア61

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2019/08/15 06:22

Twitter APIを用いてリアルタイムで取得した日本語のツイートをtest.txtというファイルを新規に作成してそこに書き込まれるようにしたいと思っているのですが、以下の箇所に自信がありません。

status = [] file = open('test.txt', 'w') if status.lang == 'ja': file.write(status) file.close()

更に、実行しようとしたところ以下のエラーが出ました。
同時に複数の質問をしてしまい恐縮ですが、どのようにコードを改良したら解決するのか、教えていただけますと幸いです。

Traceback (most recent call last): File "tweet_get.py", line 30, in <module> stream.sample() File "/Users/macuser/Workspaces/jxpress/trendword/.direnv/python-3.7.3/lib/python3.7/site-packages/tweepy/streaming.py", line 449, in sample self._start(is_async) File "/Users/macuser/Workspaces/jxpress/trendword/.direnv/python-3.7.3/lib/python3.7/site-packages/tweepy/streaming.py", line 389, in _start self._run() File "/Users/macuser/Workspaces/jxpress/trendword/.direnv/python-3.7.3/lib/python3.7/site-packages/tweepy/streaming.py", line 320, in _run six.reraise(*exc_info) File "/Users/macuser/Workspaces/jxpress/trendword/.direnv/python-3.7.3/lib/python3.7/site-packages/six.py", line 693, in reraise raise value File "/Users/macuser/Workspaces/jxpress/trendword/.direnv/python-3.7.3/lib/python3.7/site-packages/tweepy/streaming.py", line 289, in _run self._read_loop(resp) File "/Users/macuser/Workspaces/jxpress/trendword/.direnv/python-3.7.3/lib/python3.7/site-packages/tweepy/streaming.py", line 351, in _read_loop self._data(next_status_obj) File "/Users/macuser/Workspaces/jxpress/trendword/.direnv/python-3.7.3/lib/python3.7/site-packages/tweepy/streaming.py", line 323, in _data if self.listener.on_data(data) is False: File "/Users/macuser/Workspaces/jxpress/trendword/.direnv/python-3.7.3/lib/python3.7/site-packages/tweepy/streaming.py", line 54, in on_data if self.on_status(status) is False: File "tweet_get.py", line 22, in on_status if status.lang == 'ja': AttributeError: 'list' object has no attribute 'lang'

python

1import os 2import tweepy 3import math 4from collections import Counter 5 6TWITTER_CLIENT_ID = os.environ['TWITTER_CLIENT_ID'] 7TWITTER_CLIENT_SECRET = os.environ['TWITTER_CLIENT_SECRET'] 8 9TWITTER_OAUTH_TOKEN = os.environ['TWITTER_OAUTH_TOKEN'] 10TWITTER_OAUTH_TOKEN_SECRET = os.environ['TWITTER_OAUTH_TOKEN_SECRET'] 11 12auth = tweepy.OAuthHandler(TWITTER_CLIENT_ID,TWITTER_CLIENT_SECRET) 13auth.set_access_token(TWITTER_OAUTH_TOKEN,TWITTER_OAUTH_TOKEN_SECRET) 14 15class StreamListener(tweepy.StreamListener): 16 def on_status(self, status): 17 status = [] 18 file = open('test.txt', 'w') 19 if status.lang == 'ja': 20 file.write(status) 21 file.close() 22 23 def on_error(self, status_code): 24 return False 25 26stream = tweepy.Stream(auth=auth, listener=StreamListener()) 27stream.sample()

補足情報(FW/ツールのバージョンなど)

iOS 10.12.6, Python 3.7.3, Atom

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

tweepyのstream機能は使ったことないのですが、質問者さんのプログラム内のstatusというのはStatusオブジェクトではないですか?
一度type(status)で出力してみて下さい。
もしStatusオブジェクトならば、ツイート本文を表示するにはstatus.textと書きます。

python

1def on_status(self, status): 2 text = status.text 3 if status.lang == "ja": 4 with open("test.txt", "w") as f: 5 f.write(text)

で行けるのではと思います。

Statusオブジェクトはツイートに関する投稿日や本文、
投稿者など色んな情報が詰まった塊です。
そこから情報を取り出すには

python

1status.text # ツイート本文 2status.created_at # ツイートの投稿時間 3status.user.screan_name # 投稿者の@以下のID(Statusオブジェクトの中のuserの中にあるscrean_name)

等と書きます。
str(status)だとその塊が丸々文字列として羅列されたような形になると思います。

UserオブジェクトやStatusオブジェクトの構成はコチラのサイトが分かりやすいです
REST APIで取得できる情報まとめ

投稿2019/08/15 10:24

hajifu

総合スコア88

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

farinelli

2019/08/16 01:38

有難うございます。 先程実行しましたところ、どうやら最後の1件しか書き込まれていないようです。 何か心当たりはありますでしょうか?
hajifu

2019/08/16 03:53 編集

書き込みモードがwになっていて上書きされているのでは? aで追記モードで書き込むといけますでしょうか? すみません私も初心者なもので。 それか、statusの中身が私の思っているものと違うかもしれません。
farinelli

2019/08/16 04:25

いけました!有難うございます
guest

0

エラーは文言の通りです。
「AttributeError: 'list' object has no attribute 'lang'」

下記で関数の仮引数「status」と関数内の変数「status」が名前が重複しています。
リストであるstatusのlangにアクセスしてエラーが出ています。どちらかの名前を変えてコードを修正してください。

Python

1def on_status(self, status): 2 status = [] 3 file = open('test.txt', 'w') 4 if status.lang == 'ja':

投稿2019/08/15 06:31

meg_

総合スコア10577

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

farinelli

2019/08/15 06:57

有難うございます。 あれからエラーと格闘した結果、このように落ち着いたのですが、テキストの生成ができておりません。 `` ` def on_status(self, status): text = str(status) file = open('test.txt', 'w') if status.lang == 'ja': file.write(text) file.close() `` ` これはどんな状態で、どうすれば解決するのか教えていただけますと幸いです、
meg_

2019/08/15 07:29

エラーが出ていないのであれば、”status.lang='ja'」のときに何らかのテキストファイルは生成されているかと思います。 パスを指定していないので、カレントディレクトリに「test.txt」がいませんか? またstatus.langは'ja'ですか?
farinelli

2019/08/15 07:49

test.txtの存在は確認できたのですが、何のテキストも格納されていない状態です。 file = open('test.txt', 'w') 以下4行をprint(text)に変えたらツイートの情報が流れるのは確認しました。
meg_

2019/08/15 08:03

テキストファイルの中身が空ということは「file.write(text)」が実行されていないか、「text = str(status)」の後のtextの中身が空ということではないかと思います。
farinelli

2019/08/16 01:38

ファイルに文字列が書き込まれているのが確認できました。有難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問