PythonでXMLファイルを読み取って、さまざまなものを取得する必要があります。Unicodeエンコードエラーでイライラするエラーが発生し、グーグルでも理解できませんでした。
これが私のコードのスニペットです:
#!/usr/bin/python
# coding: utf-8
from xml.dom.minidom import parseString
with open('data.txt','w') as fout:
#do a lot of stuff
nameObj = data.getElementsByTagName('name')[0]
name = nameObj.childNodes[0].nodeValue
#... do more stuff
fout.write(','.join((name,bunch of other stuff))
私が解析している名前エントリにユーロ記号が含まれていると、これは見事にクラッシュします。エラーは次のとおりです。
UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 60: ordinal not in range(128)
ユーロ記号がそれを台無しにする理由は理解していますが(128であるためですよね?)、#コーディングを行うと思いました:utf-8で修正できます。また、名前が次のようになるように.encode(utf-8)を追加してみました
name = nameObj.childNodes[0].nodeValue.encode(utf-8)
しかし、それも機能しません。私は何が間違っているのですか? (私はPython 2.7.3誰かが知りたい場合は2.7.3を使用しています)
編集:Python fout.write()行でクラッシュします-名前フィールドが次のような場合は問題なく通過します:
<name>United States, USD</name>
しかし、次のような名前フィールドを使い果たします。
<name>France, € </name>
python open
組み込み関数を使用してファイルを開くときは、常にASCIIでファイルを読み取ります。別のエンコーディングでファイルにアクセスするには、コーデックを使用する必要があります。
import codecs
fout = codecs.open('data.txt','w','utf-8')
XMLパーサーからUnicodeデータを取得しているように見えますが、書き出す前にエンコードしていません。結果をファイルに書き出す前に、明示的にエンコードすることができます。
text = ",".join(stuff) # this will be unicode if any value in stuff is unicode
encoded = text.encode("utf-8") # or use whatever encoding you prefer
fout.write(encoded)