Python:将 Unicode 转换为 ASCII,对于 CSV 文件没有错误

标签 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 中,最好使用 ñ(“LIMPIADOR BAÑO 1'5 L”),但如果不可能,至少可以保存它(“LIMPIADOR BAO 1'5 L” ").

最佳答案

正确,ñ 不是有效的 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) 

现在你真正的错误不会被你把所有东西都放在同一行的事实所掩盖。如果您包含适当的回溯,也可能可以避免这种情况。

关于Python:将 Unicode 转换为 ASCII,对于 CSV 文件没有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4650639/

相关文章:

python - 匹配字符串的字符

html - Delphi 中是否有一些功能可以将带有 html 命名和编号实体的字符串转换为 unicode 文本?

python - 能够在 Eclipse 中运行带有 Unicode 字符串的 Python 代码,但通过命令行或空闲运行时出现 UnicodeEncodeError。

java - 当我在 jar 文件上运行时,Unicode 未显示在我的应用程序中

java - 带列标题的 StatefulBeanToCsv

javascript - d3 修改列名

excel - 如何使用 UTF-16 格式将 Excel 文件另存为 csv

python - 在Python中使用Sapi语音时出错

python - 测试一个类是否在Python中被调用

python - 从子文件夹和文件夹中读取文本文件,并在 pandas 中为每个文件文本创建一个数据框作为一次观察