2016-07-10 53 views
-2

在Python 2.7和Ubuntu 14.04我试图写一个CSV文件:UnicodeEncodeError:使用writerow“ASCII”编解码器不能编码字符错误和地图

csv_w.writerow(map(lambda x: flatdata.get(x, ""), columns))

这给了我臭名昭著

UnicodeEncodeError: 'ascii' codec can't encode character u'\u265b' in position 19: ordinal not in range(128)

错误。

通常建议在这里是用unicode(x).encode("utf-8") 我已经试过这一点,也只是.encode("utf-8")在获取两个参数:

csv_w.writerow(map(lambda x: flatdata.get(unicode(x).encode("utf-8"), unicode("").encode("utf-8")), columns)) 

,但我仍然得到同样的错误。

任何帮助非常感谢您摆脱错误。 (我想unicode("").encode("utf-8")是笨拙的,但我仍然是一个新手)。

编辑: 我的全程序:

抛出错误 UnicodeEncodeError: 'ascii' codec can't encode character u'\u2022' in position 14: ordinal not in range(128)
#!/usr/bin/env python 
import json 
import csv 
import fileinput 
import sys 
import glob 
import os 
def flattenjson(b, delim): 
val = {} 
for i in b.keys(): 
    if isinstance(b[i], dict): 
     get = flattenjson(b[i], delim) 
     for j in get.keys(): 
      val[ i + delim + j ] = get[j] 
    else: 
     val[i] = b[i] 
return val 
def createcolumnheadings(cols): 
    #create column headings 
    print ('a', cols) 
    columns = cols.keys() 
    columns = list(set(columns)) 
    print('b', columns) 
    return columns 
doOnce=True 
out_file= open('Excel.csv', 'wb') 
csv_w = csv.writer(out_file, delimiter="\t" ) 
print sys.argv, os.getcwd() 
os.chdir(sys.argv[1]) 
for line in fileinput.input(glob.glob("*.txt")): 
    print('filename:', fileinput.filename(),'line #:',fileinput.filelineno(),'line:', line) 
    data = json.loads(line) 
    flatdata = flattenjson(data, "__") 
    if doOnce: 
     columns=createcolumnheadings(flatdata)  
     print('c', columns) 
     csv_w.writerow(columns)     
     doOnce=False 
    csv_w.writerow(map(lambda x: flatdata.get(unicode(x).encode("utf-8"), unicode("").encode("utf-8")), columns)) 

绝密单鸣叫:可用here

解决方案按照Alistair的建议我安装了unicodescv。 的步骤是:从 here

下载的zip安装:sudo的PIP安装/path/to/zipfile/python-unicodecsv-master.zip

import unicodecsv as csv 
csv_w = csv.writer(f, encoding='utf-8') 
csv_w.writerow(flatdata.get(x, u'') for x in columns) 
+2

你能告诉一个完整的例子,有样本数据,这样我可以重现我的机器上的问题,并帮助? – Will

+0

谢谢!我已经添加了该程序。样本数据是种族主义的推文!这些是1.种族主义者和2.有识别信息。我可以给他们发邮件吗 – schoon

+0

我在dropcanvas上放了一条编辑推文,问题结尾的链接。再次感谢!! – schoon

回答

1

没有看到你的数据又好像您的数据包含Unicode数据类型(Unicode对比的简短explination见How to fix: "UnicodeDecodeError: 'ascii' codec can't decode byte"str类型)

您的解决方案,以encode它是那么容易出错 - 与非ASCII任何str在我的编码t当你unicode()它会引发错误(参见前面的链接解释)。

在写入CSV之前,您应该将所有数据转换为Unicode类型。由于Python 2.7的CSV模块已损坏,因此您需要使用替换下划线:https://github.com/jdunck/python-unicodecsv

您也可以将您的map分成单独的声明以避免混淆。确保提供完整的堆栈跟踪和代码示例。

+0

谢谢。你是什​​么意思'Python 2.7的CSV模块坏了'?我只使用地图,因为我剪切并粘贴了地图。任何有关如何扩展它的指导机会? – schoon

+0

它不支持Python 2.x Unicode字符串,这意味着您必须手动编码数据 - 插入替换为您处理编码,因此您可以使用Unicodes字符串,而不必担心代码中间的编码。 –

1
csv_w.writerow(map(lambda x: flatdata.get(unicode(x).encode("utf-8"), unicode("").encode("utf-8")), columns)) 

你已经编码了传递给flatdata.get()的参数,即字典密钥。但unicode字符不在关键位置,它们在价值中。你应该编码由get()返回值:

csv_w.writerow([flatdata.get(x, u'').encode('utf-8') for x in columns]) 
+0

谢谢。这给了我新的错误; _csv.Error:序列预期'。任何想法为什么? – schoon

+0

在参数中加入'[]',尝试一下(看起来'csv.writer'不支持迭代器?) – bobince

+0

谢谢。现在我得到AttributeError:'list'对象没有属性'encode'。 – schoon

相关问题