「Python で簡単なテキスト処理 (2) - データの抽出」では、抽出対象のデータをコード中の文字列として埋め込んだ。これをファイルから読み込んで処理するように変更する。
方法
対象のデータを、文字コード `UTF-8’ 、改行コードを LF (UNIX) にしてファイルに保存する。(データについては前回と同じものを使う。)
Python で文字コードを扱うには、codecs モジュールを利用する。「Python でUTF-8, shift_jis, euc_jpなど日本語を使う方法」 の「文字コードを指定してファイルを開き、ファイルの読み書きをするには」を参考にして、
import re, codecs # 改行でデータを分割 for line in codecs.open("./data.txt", "r", "utf_8"): # 日付の行は飛ばす if re.search('^\d{1,2}$', line): continue # 空白でレコードを分割 rec = line.split() # タブ区切りでレコードを出力 print rec[0], '\t', rec[5]
codecs
4.9 codecs -- codec レジストリと基底クラス によると、
open(filename, mode[, encoding[, errors[, buffering]]])
mode でエンコードされたファイルを開き、 透過的にエンコード・デコードを行うようにラップしたファイルオブジェクトを返します。 (…) encoding にはファイルのエンコーディングを指定します。
codecs.py の open 関数を見ると、StreamReaderWriter オブジェクトが生成され返されている。StreamReaderWriter クラスには、__iter__() が定義されており、自クラスにおいて next() を定義しているから、イテレータ になる。 (cf. Python のイテレータ) そのため、open したものを for ループに渡すことができる。
encoding に指定する文字列は、4.9.2 標準エンコーディング を参照。
ハマったところ
ファイルのエンコーディングをキチンと指定すると、ファイルの内容を読み込むことはできる。しかし、改行コードを LF (UNIX) 以外にすると文字列を想定通りに扱うことができなかった。 ( Python 2.5.2, Windows XP SP3 ) どこかに改行コードを指定するところってあるのかな (?_?)
0コメント:
コメントを投稿