2013年10月27日日曜日

[Python] 機種依存文字を無視してファイルに出力

ウェブから入力されたデータを、WindowsのExcelで開けるcsvファイルに変換しようとして行き詰まった話。

Google日本語入力なんかを使っていると機種依存文字なんかも候補に出てきてしまいますよね。
それを、UTF-8ならまだしも、shift_jisとかcp932(Windowsの日本語拡張エンコーディング)なんかに変換しようとすると、エラーを吐いて終了するわけです。

UTF-8にエンコードしてファイルに出力
#!/usr/bin/env python
# -*- coding:utf-8 -*-

f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('utf-8'))
f.close()

file.txt
機種♫依存✓文字が⊿含まれています
問題なく出力


cp932で出力
#!/usr/bin/env python
# -*- coding:utf-8 -*-

f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('cp932'))
f.close()

UnicodeEncodeErrorで終了。
Traceback (most recent call last):
  File "test.py", line 6, in 
    f.write(kishu_izon.encode('cp932'))
UnicodeEncodeError: 'cp932' codec can't encode character u'\u266b' in position 2: illegal multibyte sequence
♫がエンコード出来なかったみたいですね。

こういう時は、エラーを返す文字を無視するか、他の文字(?等)に置き換えて出力すればOK。

encodeの2引数目に'ignore'を指定。
#!/usr/bin/env python
# -*- coding:utf-8 -*-

f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('cp932','ignore'))
f.close()

file.txt
機種依存文字が⊿含まれています
変換できなかった文字は無視して出力されます。


encodeの2引数目に'replace'を指定。
#!/usr/bin/env python
# -*- coding:utf-8 -*-

f = open("file.txt", "w")
kishu_izon = u"機種♫依存✓文字が⊿含まれています"
f.write(kishu_izon.encode('cp932','replace'))
f.close()

file.txt
機種?依存?文字が⊿含まれています
変換できなかった文字は?に変換されます。

正直言うと、WindowsのExcelがcsvファイルはshift-jisじゃないと開けないとかいう困ったちゃんなのがいけないのです。

1 件のコメント:

  1. 問題が一つ解決しました。ありがとうございます。

    返信削除

Related Posts Plugin for WordPress, Blogger...