【问题标题】:Python: Convert Unicode to ASCII without errors for CSV filePython:将 Unicode 转换为 ASCII 而不会为 CSV 文件出错
【发布时间】:2011-06-06 17:51:07
【问题描述】:

我一直在 StackOverflow 中阅读有关在 Python 中从 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”) ")。

【问题讨论】:

  • 最后更新了问题。
  • 为什么不尝试编码到本地 Windows 'ANSI' 代码页?我猜您使用的是 Windows,因为 CSV 最常用于 Windows,但如果这超出了标准,请忽略我。在 *NIX 操作系统上,我想 8 位 ISO 编码中的一种是合适的,但我不是专家。

标签: python unicode csv ascii diacritics


【解决方案1】:

正确,ñ 不是有效的 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 编写器。将那条长线展开到它的各个部分:

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

现在你的真正错误不会因为你把所有东西都放在同一行中而隐藏起来。如果您包含适当的回溯,这也可能可以避免。

【讨论】:

  • 大多数 CSV 阅读器无法处理 UTF-8。 CSV 最常在 Windows 上读取,因此所谓的 ANSI 编码之一似乎最合适。
  • 好吧,我不知道“大多数”,但至少有一些。 CSV 无处不在。显然需要使用目标软件可以读取的编码。
  • 问题是上面的代码,使用 unicode 字符串 u"LIMPIADOR BA\xd1O 1'5 L" 失败,上面也详细说明了 UnicodeEncodeError 错误(“忽略”标志不起作用,我不知道为什么)。在理想情况下,我想获得一个包含完整字符串的 CSV 文件,包括 ñ.
  • @Sergi:嗯,它应该可以工作,我必须实际调试你的代码才能知道发生了什么。但无论如何:使用比 ascii 更好的编码。
  • @Lennart:好的,我应该如何将它们导出为 CSV?即使使用 utf-8,“编码”也会失败。
猜你喜欢
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-08
  • 2015-05-08
  • 1970-01-01
  • 2013-11-30
相关资源
最近更新 更多