2012-07-28 33 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