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)
看起来您正在从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)
| 归档时间: |
|
| 查看次数: |
23974 次 |
| 最近记录: |