Python:将Unicode无误转换为CSV文件的ASCII

6 投票
1 回答
24402 浏览
提问于 2025-04-16 09:44

我在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 个回答

13

没错,ñ 这个字符不是有效的 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) 

现在你真正的错误不会因为把所有东西放在同一行而被隐藏。如果你能提供一个合适的错误追踪信息,这个问题可能也能避免。

撰写回答