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

Ser*_*rgi 6 python csv unicode 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])
Run Code Online (Sandbox Code Playgroud)

的值是

(56, u"LIMPIADOR BA\xd1O 1'5 L")
Run Code Online (Sandbox Code Playgroud)

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

我想的值保存到CSV,优选与N("LIMPIADORBAÑO1'5 L"),但如果不可能的,至少能够保存它("LIMPIADOR BAO 1'5 L").

Len*_*bro 12

正确,ñ不是有效的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]) 
Run Code Online (Sandbox Code Playgroud)

哪里

row = (56, u"LIMPIADOR BA\xd1O 1'5 L")
Run Code Online (Sandbox Code Playgroud)

现在,我认为应该有效,但显然不行.我认为无论如何都会将unicode错误地传递给cvs writer.打开那条长线到它的部分:

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

现在你的真实错误不会因为你把所有东西都放在同一行中而被隐藏.如果您包含了正确的回溯,也可能已经避免了这种情况.