2011-01-13 61 views
6

正在Python中通過HTTP導入製表符分隔文件。將未知編碼的文件從Python導入到MongoDB中

在將行數據插入到MongoDB之前,我從字符串中刪除了斜線,刻度和引號。

不管數據的編碼,MongoDB是我扔的例外:以最快的速度,我可以

bson.errors.InvalidStringData: strings in documents must be valid UTF-8 

所以在努力解決這個問題,從閱讀中,我已經做了我想,使用unicode()函數將行的數據轉換爲Unicode。另外,我已經打過電話解碼()函數傳遞「統一」作爲第一個參數,但收到錯誤消息:

LookupError: unknown encoding: unicode 

從那裏,我可以讓我的字符串操作,如更換斜線,蜱,和引號。然後在將數據插入到MongoDB之前,使用str.encode('utf-8')函數將其轉換爲UTF-8。

問題:當轉換爲Unicode,我收到錯誤

UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 1258: ordinal not in range(128) 

有了這個錯誤,我不太知道從哪裏繼續。

我的問題是:如何在不知道編碼的情況下成功導入文件中的數據並將其成功插入到需要UTF-8的MongoDB中?

非常感謝!

+0

這是爲什麼標籤 「CSV」? – 2011-01-13 22:06:08

+0

但你說過「通過HTTP導入製表符分隔的文件」......「CSV」適合哪裏? – 2011-01-13 22:18:21

回答

7

嘗試以下順序:

(0)檢查您的斜槓的拆卸/蜱/等未屠宰的數據。什麼是勾號?請顯示你的代碼。請顯示原始數據的示例...使用print repr(sample_raw data)並將輸出複製/粘貼到您的問題的編輯中。 (1)有一句古老的格言:「如果文件的編碼是未知的,或者說是ISO-8859-1,那麼它就是cp1252」......你從哪裏得到它?如果它來自西歐,美洲或其他任何英語/法語/西班牙語國家/地區,並且它不是UTF-8,那麼它可能是cp1252

[編輯2]您的錯誤字節0x93解碼爲U + 201C LEFT雙引號,用於所有編碼cp1250至cp1258,包括...寫入文本的語言是什麼? (2)保存文件(刪除刻度之前),然後在瀏覽器中打開文件:它看起來合理嗎?當你點擊視圖/字符編碼時,你會看到什麼?

(3)嘗試chardet

編輯有一些建議:

一旦你知道編碼是什麼(假設它是CP1252):

(1)轉換輸入數據爲Unicode:uc = raw_data.decode('cp1252')

(2)過程中的數據(刪除斜線/蜱/等)爲Unicode:clean_uc = manipulate(uc)

(3)你需要輸出數據編碼成UTF-8:to_mongo = clean_uc.encode('utf8')

注1:您的錯誤消息指出「在1258位置無法解碼字節0x93」 ...... 1258個字節是一個相當長的塊文本;這是否合理?你有沒有看過它所抱怨的數據?怎麼樣?你看見什麼了?

注2:請考慮閱讀the Python Unicode HOWTOthis article