codecs2 - Python codecs モジュールを補完する

更新 2007年3月11日

codecs2Python モジュールです。文字列のエンコード、デコードを透過的に行うファイルオブジェクトを提供します。こうした機能はすでに codecs モジュールが提供しているものですが、codecs が対応しきれていない部分を補完しています。将来 codecs がこれらの機能を備えるようになれば、本モジュールは不要になります。

1. 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 モジュールの各オブジェクトが、内部的には(必要上)ファイルをバイナリモードで扱っているにもかかわらず、テキストモードに要求される改行コードの変換作業を肩代わりしていないことに起因しています。

2. codecs2 モジュールでの対策

そこで、codecs.open 内部で使われている codecs.StreamReaderWriter クラスをサブクラス化して、改行コードの変換処理を行うようにしました。それが codecs2.StreamReaderWriter クラスです。また、codecs.open に代わるものとして、内部的に codecs2.StreamReaderWriter を使った codecs2.open を用意しました。

3. 追加機能

上記の対策に加え、役に立つ(場合もある)、いくつかの追加機能も用意しました。

4. 使用例

基本的な使用法は 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())

5. ダウンロード

最新版は <http://www.emptypage.jp/gadgets/> から入手してください。

6. インストール

python setup.py install を実行してください。

インストールの詳しいオプションについては「Python モジュールのインストール」を参照してください。Python インタプリタがモジュールを探すパスのいずれかに codecs2.py をコピーするだけでもかまいません。

アンインストール

セットアップスクリプトが(もしくは自分で)コピーした場所から codecs2.py と(もしあれば)codecs2.pyc を削除してください。

7. リファレンス

関数

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]]])
filenamemode で指定したモードで開き、エンコード、デコードに 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.stdinsys.stdoutsys.stderr と同じファイルオブジェクトが返ります。

クラス

StreamReaderWriter(stream, Reader, Writer, errors[, linesep])
codecs.StreamReaderWriter の代わりに使います。用途と使い方については、codecs.StreamReaderWriter の解説を参照してください。

コマンドライン

codecs2.py [オプション] ファイル名...

-e | --encoding-in エンコーディング
入力ファイルのエンコーディングを指定します。
-n | --encoding-out エンコーディング
出力ファイルのエンコーディングを指定します。
-w | --newline-in 改行文字
入力ファイルの改行文字を CRLFCRLF のいずれかから指定します。
-l | --newline-out 改行文字
出力ファイルの改行文字を CRLFCRLF のいずれかから指定します。
-h | --help
ヘルプを表示。

8. 更新履歴

0.1.0 (2007-03-06)
初版。

Masaaki Shibata <mshibata at emptypage.jp>