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

有什么想法吗?我试过做字符串。在写入csv之前编码('utf-8'),但这给出了一个错误, UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 905: ordinal not in range(128)

有帮助吗?

解决方案 2

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

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

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

其他提示

UnicodeDecodeError 意味着您正在尝试编码字节,即Python2首先尝试将其解码为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。

python2上的csv模块仅适用于字节。你可以用 UnicodeWriter例子 或类似写Unicode。

所有这些"垃圾"字符都在范围内吗 <80>至 <9F>?如果是这样,很可能他们是微软的"智能报价"(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编码的文本。

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

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

所以你键入CNTRL然后V然后x然后92(没有空格)。你会看到它出来的,就像

:1,$s/<92>/'/g
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top