14

PythonでXMLファイルを読み取ってさまざまなものを取得する必要があり、Unicode Encode Errorでイライラするエラーが発生し、グーグルでも理解できませんでした。

これが私のコードのスニペットです:

#!/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を使用しています)

編集:Pythonはfout.write()行でクラッシュします-名前フィールドが次のようになっている場合は正常に処理されます:

<name>United States, USD</name>

しかし、次のような名前フィールドを使い果たします。

<name>France, € </name>
4

2 に答える 2

21

組み込み関数を使用して Python でファイルを開くと、ファイルopenは常に ascii で読み込まれます。別のエンコーディングでアクセスするには、コーデックを使用する必要があります。

import codecs
fout = codecs.open('data.txt','w','utf-8')
于 2013-03-06T02:38:23.993 に答える
5

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)
于 2013-03-06T02:40:50.267 に答える