Python Unicode编码错误序号不在<128>范围内,带有欧元符号

Joe*_*Joe 14 python unicode ascii python-2.7

我必须在Python中读取一个XML文件并抓取各种内容,然后我遇到了一个令人沮丧的错误,即Unicode编码错误,即使使用Google搜索也无法弄清楚.

以下是我的代码片段:

#!/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))
Run Code Online (Sandbox Code Playgroud)

当我正在解析的名称条目包含欧元符号时,这会非常崩溃.这是错误:

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

我理解为什么欧元符号会搞砸它(因为它是128,对吗?),但我认为做#coding:utf-8会解决这个问题.我也尝试添加.encode(utf-8),以便名称看起来像

name = nameObj.childNodes[0].nodeValue.encode(utf-8)
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.我究竟做错了什么?(如果有人想知道,我使用的是Python 2.7.3)

编辑:Python在fout.write()行崩溃 - 它会在名称字段如下的地方运行:

<name>United States, USD</name>
Run Code Online (Sandbox Code Playgroud)

但是会在名称字段上废弃:

<name>France, € </name>
Run Code Online (Sandbox Code Playgroud)

Fer*_*ves 21

当您使用open内置函数在python中打开文件时,您将始终在ascii中读取该文件.要使用其他编码访问它,您必须使用编解码器:

import codecs
fout = codecs.open('data.txt','w','utf-8')
Run Code Online (Sandbox Code Playgroud)

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

Blc*_*ght 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)
Run Code Online (Sandbox Code Playgroud)