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 字段如下所示的地方正常运行:

<name>United States, USD</name>

但是会在名称字段上废话,例如:

<name>France, € </name>
4

2 回答 2

21

当您使用open内置函数在 python 中打开文件时,您将始终以 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 回答