pythonでtwitterのbotを作る。色々やらせたい編。

日本語を投稿させる。

参考URL
Python でUTF-8, shift_jis, euc_jpなど日本語を使う方法
先日までのではASCII文字しか扱えない。しかしpythonの力で日本語を投稿させることが出来る。Unicode文字列型を使うのだ。
下準備として、以前書いたソースコード文字コードをUTF8で保存しなおす。
f:id:Number6:20090817180334p:image
保存出来たら、ソースコードの一行目に以下を追加する。

# -*- coding: utf-8 -*-

別に「# coding: utf-8」だけでもいいんだけど……。その辺は余談だから、# -*- coding:utf8 -*-について - 西尾泰和のはてなダイアリーこっち見てね。
そして以前のコードの「"naitomea"」を「u"ナイトメア"」とかにする。書き換えた結果はこちら。

# -*- coding: utf-8 -*-
import twitter
import random
list = [
	u"ナイトメア"
	,u"ダークナイト"
	,u"ルシファー"
	,u"ジ・エンド"
	,u"邪黒龍禁忌炎・殺劇舞血剣"
]
post = random.choice(list)
api = twitter.Api("username","password")
api.PostUpdate(post)

これで闇の力で日本語を操ることが出来るようになった。そろそろ闇の力飽きたからやめたい。

ファイルの中に秘められし文字列を操る

このままでは言わせたい文字列が増えていくたびに、ソースコードに追記していかなくてはならない。ソースコードは処理の流れだけを書くのが筋だし、どんどんソースコードが長くなる。台詞の部分は別ファイルで管理したい。
台詞ファイルから文字列を読み込んでリストを生成できれば、いいよね!
まず、台詞ファイルを作る。名前は「dic.txt」で、場所は「C:\python」の下、test.pyのあるところと同じ。中身は以下の通り。

ささやき
いのり
えいしょう
ねんじろ

これを文字コードUTF8で保存する。
f:id:Number6:20090817183759p:image
これで台詞ファイルが用意できた。
次にファイル入出力のメソッドを作る。今回は台詞ファイルを読み込んでリストを生成するメソッドを作る。
test.pyを以下のように変更。

# -*- coding: utf-8 -*-

import twitter
import random
import codecs

def readDic() :
	filename = "dic.txt"
	file = codecs.open(filename, "r","utf_8")
	list = file.readlines()
	result = [ one[:-2] for one in list ]
	return result

#main
list = readDic()
post = random.choice(list)
api = twitter.Api("username","password")
api.PostUpdate(post)

はい。出来た。面倒な場合は以下は読まなくていい。
解説。
defの部分がファイル読み込みのメソッド。ちょっと説明する。
最初は以下のように作った。

import codecs

def readDic() :
	filename = "dic.txt"
	file = codecs.open(filename, "r","utf_8")
	list = file.readlines()
	return list

こんな感じ。

import codecs

codecsモジュールをインポートしておく。文字コードを指定してファイルを操るときに必要。

	fliename = "dic.txt"

変数filenameに台詞ファイルの名前を入れる。相対パスでも絶対パスでもいい。

	file = codecs.open(filename, "r","utf_8")

変数fileに、「filenameのファイルを」、「読み取りモードで」、「文字コードUTF-8で」で開いたファイルオブジェクトを入れる。

	list = file.readlines()

ファイルオブジェクトのメソッドreadlinesは、そのファイルの一行一行を要素としたリストを返してくれる。ので、変数listに入れる。

	return list

変数listを返す!ということで、このメソッドを呼ぶと「dic.txt」の中身をリストにして返してくれる。

#main
list = readDic()

メソッド呼び出し。readDic()を呼び出して、返り値をlistに入れる。
ファイルオブジェクトについては、404 Not Foundで調べてほしい。
さて、ここで返ってきたリストにはちょっと問題がある。ちょっとprint文を挟んでみる。

	list = file.readlines()
	print list
	return list

実行してみる。

C:\python>python test.py
[u'\u3055\u3055\u3084\u304d\r\n', u'\u3044\u306e\u308a\r\n', u'\u3048\u3044\u305
7\u3087\u3046\r\n', u'\u306d\u3093\u3058\u308d\r\n']

C:\python>

全ての要素の末尾に\r\nというのが入っているのが判る。改行コードである。そのままポストしてもtwitter側で無視してくれるからいいんだけど、気になる人は一つずつ取り除いてあげる必要がある。
じゃあどうやって取り除こうかというと、for文を使う方法がある。

	result = []
	for one in list :
		result.append(one[:-2])

説明。

	result = []

整形したものを入れておくリストを空で作っておく。

	for one in list :

pythonのfor文は「for 要素の一つ in 要素がいっぱい入ってる奴 :」って書く。「要素がいっぱい入ってる奴」はリストとか辞書とか……。そこから一つずつとりだして、「要素の一つ」の変数に入れていく。今回なら一周ごとに変数oneにu"ささやき\r\n"や、u"えいしょう\r\n"が入っていく。なんか書いててわけわかんなくなってきた。

		result.append(one[:-2])

appendはリストのメソッドで、「リストの末尾に()内のものを追加する」メソッドである。
one[:-2]は文字列をちょっと操作して、末尾二文字を削っている。参考:
これでresultのリストに改行が抜かれたものがガンガン入っていく。
しかし!pythonには「リスト内包表記」というものがある!これを使うとこの三行が一行で書ける。

result = [ one[:-2] for one in list ]

参考URL:[Python: リスト内包表記(リストコンプリヘンション)をfor文に書き換える
リスト内包表記は便利なので個人的には使っていった方がいいと思う。
というわけで、冒頭のような感じになる。