Python:将Unicode无误转换为CSV文件的ASCII
我在StackOverflow上看了很多关于如何把Unicode转换成CSV的提问,但还是搞不清楚。每次我都收到一个错误信息:“UnicodeEncodeError: 'ascii' codec can't encode character u'\xd1' in position 12: ordinal not in range(128)”
buffer=cStringIO.StringIO()
writer=csv.writer(buffer, csv.excel)
cr.execute(query, query_param)
while (1):
row = cr.fetchone()
writer.writerow([s.encode('ascii','ignore') for s in row])
这里的row的值是
(56, u"LIMPIADOR BA\xd1O 1'5 L")
而这个\xD10在数据库里的值是ñ,这个字母在西班牙语中是带有波浪符的n。起初我试着把这个值转换成ASCII能接受的格式,但浪费了太多时间后,我现在只想忽略这些字符(我想我在处理带重音的元音时也会遇到同样的问题)。
我希望能把这个值保存到CSV里,最好是带有ñ的(“LIMPIADOR BAÑO 1'5 L”),但如果不行,至少能保存成(“LIMPIADOR BAO 1'5 L”)。
1 个回答
没错,ñ 这个字符不是有效的 ASCII 字符,所以你不能把它编码成 ASCII。就像你上面代码那样,你可以选择忽略这些字符。还有一种方法,就是去掉重音符号,你可以在这里找到相关信息: 在 Python 的 Unicode 字符串中去掉重音符号的最佳方法是什么?
不过要注意,这两种方法可能会导致一些问题,比如让单词的意思变得不同等等。所以最好还是保留重音符号。这样你就不能使用 ASCII 了,但可以使用其他编码方式。UTF-8 是比较安全的选择。Latin-1 或 ISO-88591-1 是常见的编码,但它只包含西欧字符。CP-1252 在 Windows 系统上也很常见,等等。
所以只需把 "ascii" 换成你想要的编码就可以了。
根据你的评论,你的实际代码是:
writer.writerow([s.encode('utf8') if type(s) is unicode else s for s in row])
其中
row = (56, u"LIMPIADOR BA\xd1O 1'5 L")
现在,我相信这应该能工作,但显然并没有。我觉得 Unicode 在传给 cvs 写入器时可能出错了。把那条长长的代码拆分成几个部分:
col1, col2 = row # Use the names of what is actually there instead
row = col1, col2.encode('utf8')
writer.writerow(row)
现在你真正的错误不会因为把所有东西放在同一行而被隐藏。如果你能提供一个合适的错误追踪信息,这个问题可能也能避免。