2008年9月17日水曜日

Python で簡単なテキスト処理 (4) - ファイルからの読み込み

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 ) どこかに改行コードを指定するところってあるのかな (?_?)