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

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

ただいまの
回答率

88.06%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 3,484

score 8

 前提・実現したいこと

初めまして。
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文字になってしまっていますが)

 該当のソースコード

if __name__ == '__main__':

    # キーワードで取得
    getter = TweetsGetter.bySearch(u'検索キーワード')

    for tweet in getter.collect(total = 3):
       #標準モジュールcsvのインポート
        import csv 
    try:
        #書き込み Shift_JIS
        with open('file.csv', 'w') as csvfile:
            writer = csv.writer(csvfile, lineterminator='\n')
            writer.writerow(['ツイートID', '投稿日', 'ユーザーID', '内容'])
            writer.writerow('\n')
            writer.writerow('{} {} {} {}'.format(tweet['id'], tweet['created_at'], '@'+tweet['user']['screen_name'],tweet['text']))
            writer.writerow('\n')

            #起こりそうな例外のキャッチ
    except (FileNotFoundError) as e:
        print(e)
    except (csv.Error) as e:
        print(e)

 試したこと


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"を使おうと考えました。
中々上手くできないので、申し訳ありませんが、どなたかご教授頂けますと幸いです。

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


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+5

以下の部分ですが

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

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

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

writer.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 15:00

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

    キャンセル

  • 2018/02/13 12:58

    KojiDoi様、rinren様、LouiS0616様
    ありがとうございます。投稿後から今まで頂いた情報を基に直していきました。
    KojiDoi様のおっしゃる通りで、元々は画面出力だったため、その部分は私も書き換えていました。
    (出力結果がぐちゃぐちゃになったので今回は元に戻してしまっていますが)
    また、tsvファイルを使用するということは盲点でした。ありがとうございます。

    rinren様もencodingやnewlineについて、入れてみることにしました(windowsなので)。
    また、import csv がループ内に組み込まれていることに気が付いてませんでした。
    ありがとうございます。早速修正しました。

    LouiS0616様の言うグローバルスコープは今まで気にしていなかったのですが
    やはり不味いでしょうか? 対処法として、「()で括ると良い」と話を聞きましたので
    やってみようと思います。ありがとうございました。

    キャンセル

  • 2018/02/13 13:56

    Pythonにはブロックスコープがないので、関数でくるむ場合が多いですね。
    https://qiita.com/pashango2/items/57d8a08e53a4548fb5ad

    キャンセル

+2

落ち穂拾いぽいの。

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

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


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

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

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

writer.writerow('\n')

3,FileNotFoundErrorについて

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

    except (FileNotFoundError) as e:
        print(e)

4,オマケについて

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

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

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

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


2018/02/14追記

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/13 12:58

    umyu様
    回答ありがとうございます。
    確かに冷静になってみると無駄な部分を付け加えていました。その部分も修正していこうと思います。
    私の検索不足で申し訳ありませんでした。おかげさまでfull_textで情報を集めることができました。

    tweepyの使用を考えていたのですが
    アップデートがされなくなっていると聞きましたので使用を見送っていました。
    現在も使用している方の話をみるに、大丈夫そうですね。色々と試してみたいと思います。

    キャンセル

  • 2018/02/14 00:48 編集

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

    キャンセル

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

  • ただいまの回答率 88.06%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る