web-dev-qa-db-ja.com

Python Unicode Encode Error ordinal not in range <128> with Euro Sign

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>
14
Joe

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)
5
Blckknght