输出文件中的垃圾字符(智能引号等)

时间:2012-07-28 22:20:09

标签: python mysql vim encoding smart-quotes

我正在使用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 个答案:

答案 0 :(得分: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模块仅适用于字节。您可以使用the examples或类似的UnicodeWriter来编写Unicode。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

所有这些“垃圾”字符是否在&lt; 80&gt;范围内?到&lt; 9F&gt;?如果是这样,它们很可能是微软的“智能行情”(Windows-125x编码)。有人在Word或Outlook中编写了文本,并将其复制/粘贴到Web应用程序中。 Latin-1和UTF-8都将这些字符视为控制字符,通常的效果是文本显示被截断(Latin-1)或者你看到一个?-in-black-diamond-invalid-character(UTF-) 8)。

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

答案 3 :(得分:0)

你可以在vim中解决这些问题。例如,要处理&lt; 92&gt; (这是单引号),做

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

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

一样出现
:1,$s/<92>/'/g