Python Unicode编码错误:欧元符号不在范围<128>内

14
我需要在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,对吧?),但我认为添加 # coding: 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>

异常是在哪里生成的?你能展示完整的回溯吗? - Blckknght
fout.write() 这一行是出问题的地方。错误在上面——它崩溃的名字 obj 我会编辑进去。 - Joe
2个回答

21
当你在Python中使用内置函数open打开文件时,你将始终以ASCII格式读取文件。要以另一种编码访问它,你必须使用codecs:
import codecs
fout = codecs.open('data.txt','w','utf-8')

3
对于一个2.x文件,你读取一串字节 -- 没有特定的编码方式。字节不知道它们是ASCII还是UTF-8字节。如果你向文件写入一个 unicode 对象,它会使用默认的ASCII编码进行编码,这很可能会失败。这就是codecs.open发挥作用的地方。它添加了一个包装器,处理Unicode和字节之间的编码。 - Eryk Sun
2
这可能比我的答案更好,因为它让你专门处理Unicode数据(只让IO代码担心字符编码)。在Python 2.7中,您还可以使用io.open,它也接受一个编码参数。这是Python 3中默认的open函数。 - Blckknght

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接