2013-03-26 89 views
0

我正在阅读来自许多不同国家的unicode字符的文本文件。该文件中的数据也是JSON格式。UnicodeDecodeError:'ascii'编解码器无法解码字节... Python 2.7和

我正在使用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 

我已经在这一类问题上徘徊了一个月。任何反馈将不胜感激!

+1

[如何阻止疼痛?](http://nedbatchelder.com/text/unipain.html) – 2013-03-26 20:25:08

+0

Robᵩ,谢谢!看到字节后我感觉像Neo。 – user1826936 2013-03-28 14:29:44

回答

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

从Robᵩ(http://nedbatchelder.com/text/unipain.html)的表现与我的理解unicode的真正帮助。高度推荐给任何有unicode问题的人。

我带走:

  • 转换寄托都以Unicode作为你摄取到你的应用程序。
  • 在您的代码中只使用unicode字符串
  • 在您输出应用程序中的数据时指定编码。

对于我来说,我是从标准输入和文件输出读取到stdout:

对于标准输入:

inData = codecs.getreader('utf-8')(sys.stdin) 

一个文件:

inData = codecs.open("myFile","r","utf-8") 

标准输出(在写任何东西到标准输出之前做一次):

sys.stdout = codecs.getwriter('utf-8')(sys.stdout) 
相关问题