codecs2 - Python codecs モジュールを補完する
更新
2007年3月11日
codecs2 は Python モジュールです。文字列のエンコード、デコードを透過的に行うファイルオブジェクトを提供します。こうした機能はすでに codecs モジュールが提供しているものですが、codecs が対応しきれていない部分を補完しています。将来 codecs がこれらの機能を備えるようになれば、本モジュールは不要になります。
標準ライブラリの codecs モジュールは、OS によって異なっている改行コードの変換処理を行っていません。たとえば、改行コードが '\r\n' (CR+LF) である Windows で、以下のスクリプトを実行すると、この問題が顕在化します。
import codecs
s = """First line,
second line,
and third line.
"""
fp = codecs.open('a.txt', 'w', 'latin-1')
fp.write(s)
このスクリプトを Windows で実行すると、できあがる a.txt の行は '\n' (LF) で区切られたものになってしまいます。codecs.open(...) を組み込み関数の file(...) にすると、結果の改行は正しく '\r\n' で行われます(しかしもちろんこれではエンコーディングを適切に扱うことはできない)。
これは、codecs モジュールの各オブジェクトが、内部的には(必要上)ファイルをバイナリモードで扱っているにもかかわらず、テキストモードに要求される改行コードの変換作業を肩代わりしていないことに起因しています。
そこで、codecs.open 内部で使われている codecs.StreamReaderWriter クラスをサブクラス化して、改行コードの変換処理を行うようにしました。それが codecs2.StreamReaderWriter クラスです。また、codecs.open に代わるものとして、内部的に codecs2.StreamReaderWriter を使った codecs2.open を用意しました。
上記の対策に加え、役に立つ(場合もある)、いくつかの追加機能も用意しました。
- 改行コードの変換を自前で行うようになったので、これらのクラスと関数では、追加機能として変換する改行文字の指定もできるようにしました。
- 標準入出力 (sys.stdin, sys.stdout, sys.stderr) に対してエンコード、デコードをラップしたオブジェクトを返す関数、codecs2.stdin(), codecs2.stdout(), codecs2.stderr() を用意しました。テキストフィルタを作るときなどに役に立ちます。
- 標準入出力の「バイナリモード版」のオブジェクトを返す関数、codecs2.bstdin(), codecs2.bstdout(), codecs2.bstderr() を用意しました。Windows ではこれがあるとありがたいことがあります。
- 追加機能というのとはちょっと違いますが、モジュールのスクリプトはそれ自体で単純なテキストエンコーディング変換スクリプトとして使えます。
基本的な使用法は codecs モジュールのそれに準じます。さきほどのスクリプトを codecs2 モジュールで書き換えたものは以下のようになります。
import codecs2
s = """First line,
second line,
and third line.
"""
fp = codecs2.open('a.txt', 'w', 'latin-1')
fp.write(s)
今回は Windows で実行しても改行コードがおかしくなったりはしないはずです。
ISO-8859-1 から UTF-16LE へとエンコーディングを変換する簡単なテキストフィルタの例。
import codecs2
codecs2.stdout('utf-16-le').write(codecs2.stdin('iso-8859-1').read())
最新版は <http://www.emptypage.jp/gadgets/> から入手してください。
python setup.py install を実行してください。
インストールの詳しいオプションについては「Python モジュールのインストール」を参照してください。Python インタプリタがモジュールを探すパスのいずれかに codecs2.py をコピーするだけでもかまいません。
セットアップスクリプトが(もしくは自分で)コピーした場所から codecs2.py と(もしあれば)codecs2.pyc を削除してください。
- interface(fp[, encoding[, error[, linesep]]])
- ファイルオブジェクト fp に対してエンコード、デコードに encoding で指定したエンコーディングを透過的に適用するインターフェースを提供します。error には 'strict'、'ignore'、'replace'、'xmlcharrefreplace'、'backslashreplace' および関数 codecs.register_error によって登録された名前を指定します。省略時は 'strict' とみなされます。linesep には改行文字を '\r'、'\n'、'\r\n' のいずれかから指定します。省略時は OS 標準の改行文字 (os.linesep) が使われます。
- open(filename, mode[, encoding[, error[, linesep]]])
- filename を mode で指定したモードで開き、エンコード、デコードに encoding で指定したエンコーディングを透過的に適用するファイルオブジェクトを返します。errors, linesep の意味と省略時の値は interface と同じです。
- stdin([encoding[, errors[, linesep]]])
- stdout([encoding[, errors[, linesep]]])
- stderr([encoding[, errors[, linesep]]])
- 標準入力 (stdin)、標準出力 (stdout)、標準エラー出力 (stderr) を指定したエンコーディングでラップしたファイルオブジェクトを返します。各引数の意味は interface に準じます。
- bstdin()
- bstdout()
- bstderr()
- 標準入力 (stdin)、標準出力 (stdout)、標準エラー出力 (stderr) の「バイナリモード版」のファイルオブジェクトを返します(Windows のみ)。テキストモードとバイナリモードを区別しない環境では sys.stdin、sys.stdout、sys.stderr と同じファイルオブジェクトが返ります。
- StreamReaderWriter(stream, Reader, Writer, errors[, linesep])
- codecs.StreamReaderWriter の代わりに使います。用途と使い方については、codecs.StreamReaderWriter の解説を参照してください。
codecs2.py [オプション] ファイル名...
- -e | --encoding-in エンコーディング
- 入力ファイルのエンコーディングを指定します。
- -n | --encoding-out エンコーディング
- 出力ファイルのエンコーディングを指定します。
- -w | --newline-in 改行文字
- 入力ファイルの改行文字を CR、LF、CRLF のいずれかから指定します。
- -l | --newline-out 改行文字
- 出力ファイルの改行文字を CR、LF、CRLF のいずれかから指定します。
- -h | --help
- ヘルプを表示。
- 0.1.0 (2007-03-06)
- 初版。
Masaaki Shibata <mshibata at emptypage.jp>