テキストデータを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'なんちゃららで、とても苦労していたので、基本を学ぶことができて本当に良かった。
非常に参考になった記事
parse 1.6.6 : Python Package Index
【Amazon.co.jp限定 】 ASUS ゲーミングモニター 23型フルHDディスプレイ (応答速度1ms / HDMI×2,D-sub×1 / スピーカー内蔵 / 3年保証) VX238H-P
- 出版社/メーカー: Asustek
- 発売日: 2014/05/28
- メディア: Personal Computers
- この商品を含むブログを見る
- 作者: 裕時悠示
- 出版社/メーカー: SBクリエイティブ
- 発売日: 2016/11/17
- メディア: Kindle版
- この商品を含むブログを見る
- 作者: 丸戸史明,深崎暮人
- 出版社/メーカー: KADOKAWA
- 発売日: 2016/11/19
- メディア: 文庫
- この商品を含むブログ (2件) を見る