我正在阅读一个包含来自许多不同国家/地区的unicode字符的文本文件。文件中的数据也是JSON格式。
我正在使用CentOS机器。当我在终端中打开文件时,unicode字符显示正常(因此我的终端配置为unicode)。
当我在Eclipse中测试我的代码时,它工作正常。当我在终端中运行我的代码时,它会抛出一个错误: UnicodeDecodeError:'ascii'编解码器无法解码位置17的字节0xc3:序数不在范围内(128)
for line in open("data-01083"):
try:
tmp = line
if tmp == "":
break
theData = json.loads(tmp[41:])
for loc in theData["locList"]:
outLine = tmp[:40]
outLine = outLine + delim + theData["names"][0]["name"]
outLine = outLine + delim + str(theData.get("Flagvalue"))
outLine = outLine + delim + str(loc.get("myType"))
flatAdd = ""
srcAddr = loc.get("Address")
if srcAddr != None:
flatAdd = delim + str(srcAddr.get("houseNumber"))
flatAdd = flatAdd + delim + str(srcAddr.get("streetName"))
flatAdd = flatAdd + delim + str(srcAddr.get("postalCode"))
flatAdd = flatAdd + delim + str(srcAddr.get("CountryCode"))
else:
flatAdd = delim + "None" + delim + "None" + delim +"None" + delim +"None" + delim +"None"
outLine = outLine + FlatAdd
sys.stdout.write(("%s\n" % (outLine)).encode('utf-8'))
except:
sys.stdout.write("Error Processing record\n")
所以一切正常,直到它到达StreetName,然后它与UnicodeDecodeError崩溃,这是非ascii字符开始出现的地方。
我可以通过添加.encode('utf-8')修复该实例:
flatAdd = flatAdd + delim + str(srcAddr.get("streetName").encode('utf-8'))
然后它在下一行与UnicodeDecodeError崩溃:
outLine = outLine + FlatAdd
我一直在为这些类型的问题磕磕绊绊一个月。任何反馈都将非常感谢!!
答案 0 :(得分:1)
这可能会解决您的问题。我说可能因为编码有时候会发生奇怪的事情;)
#!/usr/bin/python
# -*- coding: utf-8 -*-
text_file_utf8 = text_file.encode('utf8')
从这一点开始,你应该摆脱这些消息。如果不是这样,请提供反馈,说明您拥有的文件类型,语言。也许是一些文件头数据。
text_file.decode("ISO-8859-1")
也可能是一种解决方案。
如果全部失败,请在此处查看codecs()
; http://docs.python.org/2/library/codecs.html
with codecs.open('your_file.extension', 'r', 'utf8') as indexKey:
pass
# Your code here
答案 1 :(得分:1)
Robᵩ(http://nedbatchelder.com/text/unipain.html)的演讲真的帮助了解了我的unicode。强烈推荐给任何有unicode问题的人。
我带走了:
对我来说,我是从stdin和文件中读取并输出到stdout:
对于stdin:
inData = codecs.getreader('utf-8')(sys.stdin)
表示文件:
inData = codecs.open("myFile","r","utf-8")
用于stdout(在向stdout写入任何内容之前执行此操作):
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)