2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

IronPytonでのファイルの文字コードの扱い

Posted at

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')
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?