在Python2.7和Ubuntu14.04中,我试图写入一个csv文件:
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")
我已经尝试过了,而且在get中只对两个参数.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")
很笨拙,但我还是个新手)。在
编辑: 我的全部课程是:
^{pr2}$抛出错误UnicodeEncodeError: 'ascii' codec can't encode character u'\u2022' in position 14: ordinal not in range(128)
:的修订的单个tweet是可用的here。在
根据Alistair的建议,我安装了unicodesv。 步骤是: 从here下载zip
安装:sudo pip install/path/to/zipfile/python unicodesv-主.zip在
import unicodecsv as csv
csv_w = csv.writer(f, encoding='utf-8')
csv_w.writerow(flatdata.get(x, u'') for x in columns)
您已经对传递给
^{pr2}$flatdata.get()
的参数进行了编码,即dict键。但是unicode字符不在键中,它们在值中。您应该对get()
返回的值进行编码:在没有看到数据的情况下,您的数据似乎包含Unicode数据类型(请参见How to fix: "UnicodeDecodeError: 'ascii' codec can't decode byte"获取
Unicode
与str
类型的简要说明)你对
encode
的解决方案很容易出错——任何一个包含非ascii编码的str
都将在unicode()
时抛出一个错误(请参阅前面的链接以获得解释)。在在写入CSV之前,您应该将所有数据转换成Unicode类型。由于Python2.7的CSV模块已损坏,您将需要使用drop-in替换:https://github.com/jdunck/python-unicodecsv。在
您还可以将
map
拆分成一个单独的语句,以避免混淆。确保提供完整的stacktrace和代码示例。在相关问题 更多 >
编程相关推荐