読者です 読者をやめる 読者になる 読者になる

何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

Pythonで自分のTwitterのツイートを用いて遊ぶ試み

仕事でちょっとした作業をやりたいときにそれをPythonで書くことがある。もっと本格的に業務でPythonを使いたいのだがまだまだ布教が足りないようである(どう考えても新人が発する台詞ではない)。布教のためにはPythonで何かできるかを自分で示してその威力を感じてもらうほかないと思い、その試みの第一弾としてTwitterを題材に遊んでみることにする。
まず、ここを参照して自分の全ツイートを取得する。APIを使うのが自然かもしれないが気軽にやりたいので差し当たりこれでよい。ツイートの情報はcsvファイルかjsonファイルで取り扱うことが出来る。最初はPythonの標準ライブラリを用いてcsvを読み込もうとしたが文字エンコードに阻まれて断念した。仕方ないのでjsonファイルで取り扱うことにした。Twitterから手に入れたデータのREADME.txtには

出力したデータをプログラミング言語JSONパーサーで処理するには、各ファイルの先頭と末尾の行を取り除いてください。

とあるので削除してみたが上手くいかない。ファイルの先頭を削除する必要があるのはすぐわかったが、末尾を取り除く必要が無いのではないのか。
そして読み込んだjsonファイルからツイート本文だけを抜き出して別のファイルに書き込む。エンコードの関係で訳がわからないエラー(UnicodeEncodeError)が発生する。奇妙なテキストは必要ないので例外処理で切り抜けた。
以下は上記作業のPythonスクリプトである。

import os
import json
from collections import deque

os.chdir('path/to/jsonfile')

# 拡張子を除いたファイル名のリストの生成
# Twitterからのjsonファイルは.jsなので加工したものは.jsonとすることにした
file_names = sorted(set([filename.strip('.json') for dirpath, dirnames, filenames in os.walk('.')
                         for filename in filenames]))

# オリジナルのjsonファイルから先頭行を削除する
# 先頭・末尾を削除すると聞かされたのでdequeを用いているがもっと単純に書けると思う
for file_name in file_names:
    with open(file_name+'.js', 'r') as in_f, open(file_name+'.json', 'w') as out_f:
        tmp = deque(in_f.readlines())
        tmp.popleft()
        for line in tmp:
            out_f.write(line)

# jsonファイルからツイート本文を抜き出す。
# 各ツイートはPythonの辞書データとなるので簡単に取り出せる。
# 差し当たり、@replyは無視するようにしてある。
# UnicodeEncodeErrorは無視している
for file_name in file_names:
    with open(file_name +'.json') as in_f, open('path/to/ret.txt', 'a') as out_f:
        data = json.loads("".join(in_f.readlines()))
        for d in data:
            try:
                if '@' not in d['text']:
                #print(d['text'])
                    out_f.write(d['text']+'\n')
            except UnicodeEncodeError:
                pass

次回(があれば)、取得したツイート本文を用いて遊んでみたい。