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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

827閲覧

"Python"で収集したデータを"csvファイル"にまとめたい

youch

総合スコア8

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

1グッド

2クリップ

投稿2018/02/12 02:51

編集2018/02/13 11:31

前提・実現したいこと

初めまして。
Pythonの勉強を少し始めましたばかりなので色々と拙い説明になると思いますがご容赦ください。

Python を使用し、Twitterのデータを収集し、csvファイルにまとめようとしています。
様々なサイト様や書籍のおかげで、Twitterのデータを収集するまではできました。
問題はそれをcsvファイルにまとめるところです。

csvファイルに書き込みをすることはできたのですが…
1つのセルに1文字になったり、1つのセルに全て入ってしまったり、ごちゃごちゃになってしまいます。
自分ではこれ以上、分かりそうにないので、どなたか知恵をお貸し頂けないでしょうか。


理想

|ツイートID|投稿日|ユーザーID|投稿内容|
|:--|:--:|--:|
|ユーザー1のデータ|ユーザー1のデータ|ユーザー1のデータ|ユーザー1のデータ
|ユーザー2のデータ|ユーザー2のデータ|ユーザー2のデータ|ユーザー2のデータ

というように、ユーザー毎に行。データ毎に列を分けたいです。

発生している問題・エラーメッセージ

csvファイルに書き出しする際、予想と反した内容になってしまう。 例: 1つのセルに1文字(1045というデータの場合「1」「0」「4」「5」という様にセルが変わってしまいます) 1つのセルに全データ(各データ毎にセルを分けたいです) ごちゃごちゃになってしまう(弄りすぎて変な所で改行されたりしています) 下記に個人的には一番上手くできた物を載せます (1つのセルに1文字になってしまっていますが)

該当のソースコード

Python

1if __name__ == '__main__': 2 3 # キーワードで取得 4 getter = TweetsGetter.bySearch(u'検索キーワード') 5 6 for tweet in getter.collect(total = 3): 7 #標準モジュールcsvのインポート 8 import csv 9 try: 10 #書き込み Shift_JIS 11 with open('file.csv', 'w') as csvfile: 12 writer = csv.writer(csvfile, lineterminator='\n') 13 writer.writerow(['ツイートID', '投稿日', 'ユーザーID', '内容']) 14 writer.writerow('\n') 15 writer.writerow('{} {} {} {}'.format(tweet['id'], tweet['created_at'], '@'+tweet['user']['screen_name'],tweet['text'])) 16 writer.writerow('\n') 17 18 #起こりそうな例外のキャッチ 19 except (FileNotFoundError) as e: 20 print(e) 21 except (csv.Error) as e: 22 print(e) 23

試したこと


http://ailaby.com/twitter_api/
コチラを参考に、txtファイルでもやろうとしましたが、全て一列で並んだ形になってしまいます。
(txtファイルをExcelで読み込むつもりでやりました)


https://qiita.com/koara-local/items/0e56bc1e58b11e4d7a32
https://qiita.com/okadate/items/7b9620a5e64b4e906c42
pandas という物が有効と情報を得たので、コチラを参考に色々と試してみました。
syntax error が出て混乱したので止めました。

オマケ

時々、Twitterのデータを収集する際に文字が長いのか切れることがあります。
(Twitter上では 「私は今日、ご飯を食べた」なのに集めると「私は今日、ご飯を…」みたいに)
コードは①で上げた【http://ailaby.com/twitter_api/】とまるっきり同じなので
そういう仕様なのでしょうか?

現在の状況

umyu様、KojiDoi様、rinren様、LouiS0616様の助けを借り
・csvファイルではなく、txtファイルおよびtsvファイルで出力することに
・full_textを収集することに
→そのため、収集面は大丈夫になりました!ありがとうございます。

tsvファイルおよびtxtファイルを作成するところまで出来ました。
今度は、持ってきたfull_txtに改行コード等があることに気が付きました。
(Excelでインポートすると何かごちゃごちゃになるって言っていたのはコレが原因だったみたいです)

そのため、改行コードなどを消してしまうために"replace"を使おうと考えました。
中々上手くできないので、申し訳ありませんが、どなたかご教授頂けますと幸いです。

Python

1f.write(tweet['full_text'.replace('\r\n', '')])

というように書いたのですが、やはりツイートデータ1つ1つに
改行などを削除する様にはできないのですか?
今まで手に入った物は手作業でExcelに打ち込んでいたのですが…流石に数が多くて。

YProg👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

以下の部分ですが

python

1writer.writerow('{} {} {} {}'.format(tweet['id'], tweet['created_at'], '@'+tweet['user']['screen_name'],tweet['text']))

出力すべきデータをわざわざ単一の文字列にしてwriterowに渡しているのがまずいのではないでしょうか。画面に出力する仕様だった参照元のコード例を文脈を考えずにコピペしているのが敗因と思います。

必要なライブラリを持っていないので試していませんが、たぶん下のような感じではないでしょうか。

python

1writer.writerow([tweet['id'], tweet['created_at'], '@'+tweet['user']['screen_name'],tweet['text']])

あと、カンマ区切りの出力はあまりよろしくありません。本文(ツイート)が"10,000円の買い物をした"といった内容だったときにどうなるか考えてみてください。カンマをエスケープする手もありますが、区切り文字をタブにする(TSVファイルで出力する)のが、より簡単でしょう。

writer = csv.writer(csvfile, lineterminator='\n', delimiter='\t')

投稿2018/02/12 03:51

KojiDoi

総合スコア13669

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

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

rinren

2018/02/12 04:34

更にcsv.openの時に、encodingを指定することや、windows環境であれば、newline=''のオプションを渡すとよいでしょう。 こんな感じ。 with open('file.csv', 'w', newline='', encoding='shift-jis') as csvfile:
rinren

2018/02/12 04:52

それと余談ですが、これループの中に入っちゃってます。 #標準モジュールcsvのインポート import csv インクルードガードが利いて大丈夫だと思いますが。それに頼るのはすこしムズムズします。 必ずツイート取得できるなら、別に外でもいいですよね? ツイート取得した時しか、絶対にimportしたくないっていうこだわりがあるなら強く勧めはしませんが。 なんか、こう。癖として、ループの中は嫌だなーと。結局大丈夫なんですけどね。
LouiS0616

2018/02/12 06:00

グローバルスコープが汚染されているのもすごく気になりますね。
youch

2018/02/13 03:58

KojiDoi様、rinren様、LouiS0616様 ありがとうございます。投稿後から今まで頂いた情報を基に直していきました。 KojiDoi様のおっしゃる通りで、元々は画面出力だったため、その部分は私も書き換えていました。 (出力結果がぐちゃぐちゃになったので今回は元に戻してしまっていますが) また、tsvファイルを使用するということは盲点でした。ありがとうございます。 rinren様もencodingやnewlineについて、入れてみることにしました(windowsなので)。 また、import csv がループ内に組み込まれていることに気が付いてませんでした。 ありがとうございます。早速修正しました。 LouiS0616様の言うグローバルスコープは今まで気にしていなかったのですが やはり不味いでしょうか? 対処法として、「()で括ると良い」と話を聞きましたので やってみようと思います。ありがとうございました。
guest

0

落ち穂拾いぽいの。

1,以下のインデントが正しいと仮定するとcsvには最終行のデータしか出力されません。
プログラムは上から下に実行するため、csvのヘッダー行を書き込んだ後、forループを回せば良いです。

Python

1 for tweet in getter.collect(total = 3): 2 #標準モジュールcsvのインポート 3 import csv 4 try:

2,ファイルの改行について

Python

1writer = csv.writer(csvfile, lineterminator='\n')

csv.writerのlineterminatorオプションを指定しているため、writer.writerowは改行付きでファイル出力されます。
よって以下の改行を付与するコードは不要かと。

Python

1writer.writerow('\n')

3,FileNotFoundErrorについて

with open('file.csv', 'w') as csvfile:と'w'の書き込みモードでファイルを開いている(open)しているため、FileNotFoundErrorは発生しません。

Python

1 except (FileNotFoundError) as e: 2 print(e)

4,オマケについて

時々、Twitterのデータを収集する際に文字が長いのか切れることがあります。

140文字以上のツイートを取得するのリンク先に記載がありますが。
1,リクエストするエンドポイントが変わる。
2, status.textではなくstatus.full_textに変わる。

使用しているライブラリの.textを返す部分を確認してみてくださいな。

あとはtwitter APIとのやり取りは自作するより、
python-twitter または tweepyのライブラリを使用する形の方がいいです。


2018/02/14追記

以下のコードだと'full_text'という文字列に対してreplaceを行っています。以下のように変更してください。

Python

1f.write(tweet['full_text'.replace('\r\n', '')])

Python

1f.write(tweet['full_text'].replace('\r\n', ''))

分かりづらいなって思った時は作業変数を1個増やすとデバック確認が行いやすいです。
例えば以下のようなfull_text という変数を1個増やす形です。

Python

1full_text = tweet['full_text'] 2print(full_text) 3print(full_text.replace('\r\n', '')) 4f.write(full_text.replace('\r\n', ''))

投稿2018/02/12 07:34

編集2018/02/13 15:45
umyu

総合スコア5846

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

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

youch

2018/02/13 03:58

umyu様 回答ありがとうございます。 確かに冷静になってみると無駄な部分を付け加えていました。その部分も修正していこうと思います。 私の検索不足で申し訳ありませんでした。おかげさまでfull_textで情報を集めることができました。 tweepyの使用を考えていたのですが アップデートがされなくなっていると聞きましたので使用を見送っていました。 現在も使用している方の話をみるに、大丈夫そうですね。色々と試してみたいと思います。
umyu

2018/02/13 15:48 編集

ライブラリを採用するメリットは 1,自分でコードを書かなくても他の人が実装している「テスト済み」のコードを採用できる。 2,問題が発生時にぐーぐる検索時によく知られているライブラリだと解決方法が書かれている事がある。 デメリットは 1,ライブラリの学習コストが掛かる。 2,導入コストが一手間掛かる 3,ライブラリのライセンスを意識する必要がある。 すぐに思いつくのはこんなところでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問