2013-03-06 11 views
13

PythonでXMLファイルを読んでいろいろなことを把握する必要があり、私はグーグルでも理解できないUnicode Encode Errorでうんざりなエラーに遭遇しました。Python Unicodeエンコードエラー序数が範囲外<128>ユーロ記号

は、ここに私のコードの抜粋です:

#!/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)) 

私が解析しています名前エントリはユーロ記号が含まれている場合、これが見事にクラッシュします。ここでエラーです:(?それは右、128のだから)ユーロ記号がそれを台無しになる理由

UnicodeEncodeError: 'ascii' codec can't encode character u'\u20ac' in position 60: ordinal not in range(128) 

は、私が理解し、私は#のコーディングをやって考えた:UTF-8はそれを修正します。私はまた、名前の代わりに.encode(utf-8)を追加しようとしました。

name = nameObj.childNodes[0].nodeValue.encode(utf-8) 

しかし、それも動作しません。私は間違って何をしていますか? (誰もが知りたい場合、私は、Python 2.7.3を使用しています)

EDIT:Pythonはfout.write()ライン上でクラッシュ - 名前のフィールドが似ているところは罰金を通過します:

<name>United States, USD</name> 

しかし、のような名前のフィールドにがらくたます:あなたは常にASCIIでファイルを読み込みますopen組み込み関数を使用してPythonでファイルを開いているとき

<name>France, € </name> 
+0

ここで例外が生成されますか?完全なトレースバックを表示できますか? – Blckknght

+0

fout.write()行はどこにあるのでしょうか。エラーが発生しました。名前がobjでクラッシュしました。それを編集します。 – Joe

答えて

20

。あなたはコーデックを使用する必要があり、別のエンコーディングでそれにアクセスするには:

import codecs 
fout = codecs.open('data.txt','w','utf-8') 
+3

2.xファイルの場合、特定のエンコーディングがないバイト文字列を読み取ります。バイトは、それらがASCIIバイトかUTF-8バイトか分からない。ファイルに 'unicode'オブジェクトを書き込むと、デフォルトのASCIIエンコーディングでエンコードされますが、これはおそらく失敗します。これは 'codecs.open'が出現するところです。これは、Unicodeとバイトとの間のエンコードを処理するラッパーを追加します。 – eryksun

+2

これは、Unicodeデータを排他的に扱うことができるので(IOコードが文字エンコーディングを心配するだけで済むため)、これはおそらく私よりも優れた答えです。また、Python 2.7で 'io.open'を使うこともできます。これはエンコーディングパラメータも受け付けます。これはPython 3のデフォルトの 'open'です。 – Blckknght

+0

ありがとうございました。 – Joe

4

あなたの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) 
関連する問題