Python:将Unicode转换为ASCII而不会出现CSV文件错误

时间:2011-01-10 19:28:31

标签: python unicode csv ascii diacritics

我一直在阅读有关在StackOverflow中使用Python从Unicode转换为CSV的所有问题,我仍然迷失了方向。每次我收到“UnicodeEncodeError:'ascii'编解码器都不能编码位置12中的字符u'\ xd1':序数不在范围内(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])

的值为

(56, u"LIMPIADOR BA\xd1O 1'5 L")

其中数据库中\ xd10的值为ñ,在西班牙语中使用带有变音符号的n。起初我试图将值转换为ascii中的有效值,但在失去这么多时间之后我只想忽略那些字符(我想我的重音元音有同样的问题)。

我想将值保存到CSV,最好使用ñ(“LIMPIADORBAÑO1'5L”),但如果不可能,至少可以保存(“LIMPIADOR BAO 1'5 L “)。

1 个答案:

答案 0 :(得分:12)

正确,ñ不是有效的ASCII字符,因此您无法将其编码为ASCII。因此,您可以像上面的代码那样忽略它们。另一种方法,即删除重音,你可以在这里找到: What is the best way to remove accents in a Python unicode string?

但请注意,这两种技术都会导致不良影响,例如使单词实际上意味着不同的东西,等等。所以最好是保留重音。然后你不能使用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 writer。打开那条长线到它的部分:

col1, col2 = row # Use the names of what is actually there instead
row = col1, col2.encode('utf8')
writer.writerow(row) 

现在,您将所有内容都放在同一行中,不会隐藏您的真实错误。如果您包含了正确的回溯,也可能已经避免了这种情况。