2012-07-28 64 views
1

我正在使用python从mysql数据库中读取一串字符串,并在经过一些处理后将它们写入CSV文件。不过,我看到一些完全垃圾的字符出现在csv文件中。例如,当我使用gvim打开csv时,我看到诸如<92>,<89>,<94>等字符。输出文件中的垃圾字符(智能引号等)

有什么想法?我试图做string.encode(“UTF-8”)写入CSV之前,但给了一个错误,UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 905: ordinal not in range(128)

+0

不幸的是,我不允许共享代码。如果你真的需要的话,我可以发一些伪装。这只是简单的数据库读取,然后串联少数字符串,然后写入CSV。 – JZee 2012-07-28 22:23:56

+3

你从数据库接收到什么编码? – Amber 2012-07-28 22:24:25

+0

@琥珀,默认的?这是latin1_swedish_ci? – JZee 2012-07-28 22:31:14

回答

0

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

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

我不知道怎么的逻辑声音,但是这是我几个小时的谷歌搜索出土后,它似乎为我工作。

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。

0

所有这些“垃圾”字符的范围是< 80>到< 9F>?如果是这样,他们很有可能是微软的“Smart Quotes”(Windows-125x编码)。有人在Word或Outlook中写下了文本,并将其复制/粘贴到Web应用程序中。 Latin-1和UTF-8都将这些字符视为控制字符,通常的效果是文本显示被切断(Latin-1)或者您看到一个黑色菱形无效字符(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编码的文本。

0

你可以在vim中修复这些问题。例如,为了应对< 92>(这是单引号),做

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

所以你键入CNTRL然后V,那么X,则92(无空格)。你会看到它就像

:1,$s/<92>/'/g