Hope is a Dream. Dream is a Hope.

非公開ブログは再開しました。

テキストデータをPython標準ライブラリでパースする方法

テキストデータをPython標準ライブラリでパースする方法

データベースを使ったWebアプリをFlaskを使って作ろうとしているのだが、

開発途中では、テストデータを扱うが、準備が面倒だし、データデータベースへの入力も一括でしたい。。。

そこで、テストデータを決められたフォーマットで作成し、Python標準ライブラリのparseを使ってパースするコードを書きました。

パースの方法

まずデータを準備

testdata.txt

@title: タイトルが書かれている
@result: 結果が書かれている
@conclusion: 結論が書かれている
@day: 2015-02-17
----------------------
@title: タイトルが書かれている
@result: 結果が書かれている
@conclusion: 結論が書かれている
@day: 2015-02-17
----------------------
(続く)

 

パース用の構文を準備
[python]
# 文章を区切るセパレータ
uSPLITTER = u'-------------------'
# パースする要素
WORDS = [u'title', u'result', u'conclusion', u'day']
# ファイルの読み込み (Unicode)
f = codecs.open(self.inFile, 'r', 'utf-8')
# ファイルからテキストとして読み込み
contents = f.read().split(uSPLITTER)
# ファイルを閉じる
f.close()
# パース用構文をコンパイル
cmp = compile('{}@title{}@result{}@conclusion{}@day{}')
# テストテキストの読み込み
datalist = []
for t in contents:
# パースの実行
d = cmp.parse(t)
# 取得した各項目データの格納
data = {}
for w in WORDS:
data[w] = d[w]
# 取得データの格納
datalist.append(data)
# (おまけ)
# 書き込みモードで開く
f = open('output.txt', 'w')
# ここでutf-8エンコード
f.writelines(data.encode('utf-8'))

 

[/python]

注意

encode('utf-8')はstring型しか使えない。辞書型であれば、for k,v in dict.items():等を使って、各要素へアクセスするひつようがある。

まとめ

ここ2週間ほどPythonを触っているが、ずっと悩まされていた文字コードに関する取り扱いがやっとわかった気がします。

BeautifulSoupや自然言語処理ライブラリを使いたくて、適当にサンプルコードを走らせようとすると、いつも'ascii'なんちゃら'Unencode error'なんちゃららで、とても苦労していたので、基本を学ぶことができて本当に良かった。

非常に参考になった記事

Pythonicな文字列パーサ parse

parse 1.6.6 : Python Package Index

俺の彼女と幼なじみが修羅場すぎる12 (GA文庫)

俺の彼女と幼なじみが修羅場すぎる12 (GA文庫)