我正在读取和解析 Amazon XML 文件,虽然 XML 文件显示 ' ,但当我尝试打印它时,出现以下错误:
'ascii' codec can't encode character u'\u2019' in position 16: ordinal not in range(128)
从我迄今为止在网上阅读的内容来看,错误是由于 XML 文件采用 UTF-8 格式,但 Python 希望将其作为 ASCII 编码字符来处理。有没有一种简单的方法可以消除错误并让我的程序在读取时打印 XML?
您的问题可能是您解析得很好,但现在您尝试打印 XML 的内容,但无法打印,因为存在一些外来 Unicode 字符。 首先尝试将您的 unicode 字符串编码为 ascii:
unicodeData.encode('ascii', 'ignore')
“忽略”部分将告诉它跳过这些字符。 来自 python 文档:
>>> # Python 2: u = unichr(40960) + u'abcd' + unichr(1972)
>>> u = chr(40960) + u'abcd' + chr(1972)
>>> u.encode('utf-8')
'\xea\x80\x80abcd\xde\xb4'
>>> u.encode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
UnicodeEncodeError: 'ascii' codec can't encode character '\ua000' in position 0: ordinal not in range(128)
>>> u.encode('ascii', 'ignore')
'abcd'
>>> u.encode('ascii', 'replace')
'?abcd?'
>>> u.encode('ascii', 'xmlcharrefreplace')
'ꀀabcd޴'
您可能想阅读这篇文章:http://www.joelonsoftware.com/articles/Unicode.html,我发现它作为有关正在发生的事情的基本教程非常有用。 读完后,您将不再感觉自己只是在猜测要使用哪些命令(或者至少发生在我身上)。
更好的解决方案:
if type(value) == str:
# Ignore errors even if the string is not proper UTF-8 or has
# broken marker bytes.
# Python built-in function unicode() can do this.
value = unicode(value, "utf-8", errors="ignore")
else:
# Assume the value object has proper __unicode__() method
value = unicode(value)
如果您想了解更多有关原因的信息:
http://docs.plone.org/manage/troubleshooting/unicode.html#id1
不要在脚本中对环境的字符编码进行硬编码;直接打印 Unicode 文本:
assert isinstance(text, unicode) # or str on Python 3
print(text)
如果您的输出被重定向到文件(或管道);您可以使用
PYTHONIOENCODING
envvar 来指定字符编码:
$ PYTHONIOENCODING=utf-8 python your_script.py >output.utf8
否则,
python your_script.py
应该按原样工作——您的语言环境设置用于对文本进行编码(在POSIX检查上:LC_ALL
、LC_CTYPE
、LANG
环境变量——将LANG
设置为utf-8语言环境)如果需要的话)。
要在 Windows 上打印 Unicode,请参阅此答案,其中演示了如何将 Unicode 打印到 Windows 控制台、文件或使用 IDLE。
优秀的帖子:http://www.carlosble.com/2010/12/understanding-python-and-unicode/
# -*- coding: utf-8 -*-
def __if_number_get_string(number):
converted_str = number
if isinstance(number, int) or \
isinstance(number, float):
converted_str = str(number)
return converted_str
def get_unicode(strOrUnicode, encoding='utf-8'):
strOrUnicode = __if_number_get_string(strOrUnicode)
if isinstance(strOrUnicode, unicode):
return strOrUnicode
return unicode(strOrUnicode, encoding, errors='ignore')
def get_string(strOrUnicode, encoding='utf-8'):
strOrUnicode = __if_number_get_string(strOrUnicode)
if isinstance(strOrUnicode, unicode):
return strOrUnicode.encode(encoding)
return strOrUnicode
我编写了以下内容来修复令人讨厌的非 ASCII 引号并强制转换为可用的内容。
unicodeToAsciiMap = {u'\u2019':"'", u'\u2018':"`", }
def unicodeToAscii(inStr):
try:
return str(inStr)
except:
pass
outStr = ""
for i in inStr:
try:
outStr = outStr + str(i)
except:
if unicodeToAsciiMap.has_key(i):
outStr = outStr + unicodeToAsciiMap[i]
else:
try:
print "unicodeToAscii: add to map:", i, repr(i), "(encoded as _)"
except:
print "unicodeToAscii: unknown code (encoded as _)", repr(i)
outStr = outStr + "_"
return outStr
如果您需要将字符串的近似表示打印到屏幕上,而不是忽略那些不可打印的字符,请在此处尝试
unidecode
包:
https://pypi.python.org/pypi/Unidecode
解释可以在这里找到:
https://www.tablix.org/~avian/blog/archives/2009/01/unicode_transliteration_in_python/
这比对给定字符串
u.encode('ascii', 'ignore')
使用 u
更好,并且如果字符精度不是您所追求的,但仍希望具有人类可读性,可以使您免于不必要的麻烦。
威拉万
“字符串”.encode('utf-8')
尝试在 python 脚本的顶部添加以下行。
# _*_ coding:utf-8 _*_
Python 3.5,2018
如果您不知道编码是什么,但 unicode 解析器有问题,您可以在
Notepad++
中打开文件,然后在顶部栏中选择 Encoding->Convert to ANSI
。然后你就可以像这样编写你的Python了
with open('filepath', 'r', encoding='ANSI') as file:
for word in file.read().split():
print(word)