sjis ファイルの読み書き。最終的な結果はごく普通ですが、、、
まず、ふつうにぐぐると codecs.getreader/writer を使った例が出てますが、
- バイナリモードを強制されて行末処理をやってくれない
- codec に shift-jis, cp932 がない。mbcs なら指定できますけど windows の言語切り替えなんかをされると不安
ので不可。結論としては string.encode(), decode() を使用します
読み込み:
for line in open('file.txt', 'rt'):
linedec = line.decode('cp932')
...
また、書き出しは
str(a_unicode_string)
が UnicodeEncodeError になるという素敵な仕様orz のため型のはっきりしないオブジェクトを
扱う場合デフォルト動作に頼れず、自力文字列化が必要です。この部分の表記法はなぜか
'%s' % obj
とやるとできてしまいます。(このコードの動作 str() と同じであってもいい気もするんですが)
あと、文字コード設定を何もしないで open したファイルに unicode 文字列を書き出そうとすると、 UnicodeEncodeError くらいます。しかも text モードで開いた場合、書き出したところでなく、flush 時におきるのでエラーリカバリができないというなかなか困った動作をします。
UTF16 のバイナリファイルとは扱ってくれていないようで。
というわけで書きだし:
f=open('sjis.txt', 'wt')
lineenc = linestr.encode('cp932')
print >>f, lineenc
print >>f, ('%s' % some_object).encode('cp932')