1

我正在使用 python 从 mysql 数据库中读取一堆字符串,经过一些处理后,将它们写入 CSV 文件。但是,我看到 csv 文件中出现了一些完全垃圾的字符。例如,当我使用 gvim 打开 csv 时,我会看到<92><89>等字符<94>

有什么想法吗?我尝试在写入 csv 之前执行 string.encode('utf-8') 但这给出了一个错误UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 905: ordinal not in range(128)

4

4 回答 4

0

UnicodeDecodeError意味着您正在尝试对字节进行编码,即 Python 2 首先尝试将其解码为 Unicode,然后使用指定的编码对其进行编码:

>>> b"€".encode('utf-8')
Traceback (most recent call last):
  File "<input>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: 
ordinal not in range(128)

如果数据是文本(不是图像等固有的二进制数据);您应该使用 Unicode 来处理它。如果您的数据库驱动程序不返回 Unicode,则在收到字节后立即将它们转换为 Unicode。

Python 2 上的 csv 模块仅适用于字节。您可以使用UnicodeWriter示例类似内容来编写 Unicode。

于 2012-07-28T23:30:09.667 回答
0

我最终解决了它。我正在使用 MySQLdb python 模块连接到 mysql。我刚刚使用charset=utf8use_unicode = True在创建数据库连接时使用它。此外,我将 MySQL 表的排序规则更改为utf8_unicode_ci. 最后,当我将字符串写入 csv 文件时,我使用了:

file_pointer.write(my_string.encode('ascii', 'ignore'))

我不知道逻辑有多合理,但这是我在谷歌搜索几个小时后发现的,它似乎对我有用。

于 2012-07-28T23:55:15.730 回答
0

所有这些“垃圾”字符都在 <80> 到 <9F> 范围内吗?如果是这样,它们很可能是 Microsoft“智能引号”(Windows-125x 编码)。有人在 Word 或 Outlook 中编写文本,然后将其复制/粘贴到 Web 应用程序中。Latin-1 和 UTF-8 都将这些字符视为控制字符,通常的效果是文本显示被截断 (Latin-1) 或者您看到 ?-in-black-diamond-invalid-character (UTF- 8)。

请注意,Word 和 Outlook 以及其他一些 MS 产品提供了 UTF-8 版本的文本供剪贴板使用。代替 <80> 到 <9F> 代码,智能引号字符将是正确的多字节 UTF-8 序列。如果您的网页是 UTF-8 格式,您通常应该得到一个正确的 UTF-8 字符,而不是 Windows-125x 编码中的智能引号。另请注意,这不是保证行为,但“似乎非常一致地工作”。这一切都取决于文本的 UTF-8 版本是否可用,并且处理得当(例如,您没有粘贴到 PC 上的 gvim 中,然后复制/粘贴到 Web 文本表单中)。这也适用于各种 PC 应用程序,只要它们正在寻找 UTF-8 编码的文本。

于 2013-09-04T17:08:41.760 回答
0

您可以在 vim 中修复这些问题。例如,要处理 <92> (这是单引号),做

:1,$s/CNTRL-V x 92/'/g

所以你输入 CNTRL 然后 V 然后 x 然后 92 (没有空格)。你会看到它就像

:1,$s/<92>/'/g
于 2013-11-20T21:06:08.580 回答