2011-04-28 32 views
1

我知道我以前在另一份工作上做過這件事,但我不記得我做了什麼。如何在python中編寫自定義編碼來清理我的數據?

我有一個數據庫,充滿了從Office,網頁和誰知道還有其他地方剪切和粘貼的varchar和備註字段。這開始對我造成編碼錯誤。由於Python有一個非常不錯的「解碼」功能來獲取字節流並將其轉換爲Unicode,我認爲這隻會編寫自己的編碼來解決這個問題。 (例如,將「智能報價」轉化爲「標準報價」)。

但我不記得如何開始。我想我複製了一個很接近的編碼(cp1252.py),然後更新它。

任何人都可以把我放在正確的道路上?或者建議更好的路徑?

回答

2

我已經擴大了這一點的一些細節。

如果您確信數據庫中文本的編碼,則可以使用text.decode('cp1252')來獲取Unicode字符串。如果猜測是錯誤的,這可能會破壞一個例外,或者解碼器將「消失」一些字符。

沿着您描述的線條創建解碼器很簡單(修改cp1252.py)。你只需要定義從字節到Unicode字符的轉換表。

但是,如果不是數據庫中的所有文本都具有相同的編碼,則解碼器將需要一些規則來決定哪個是正確的映射。在這種情況下,您可能需要打底並使用chardet module,它可以掃描文本並猜測編碼。

也許最好的方法是嘗試使用最有可能的編碼(cp1252)進行解碼,如果失敗,則回退到使用chardet來猜測正確的編碼。

如果您使用text.decode()和/或chardet,則最終會生成一個Unicode字符串。下面是一個簡單的例程,它可以轉換Unicode字符串中的字符,例如「轉換彎引號,以ASCII」:

CHARMAP = [ 
    (u'\u201c\u201d', '"'), 
    (u'\u2018\u2019', "'") 
    ] 

# replace with text.decode('cp1252') or chardet 
text = u'\u201cit\u2019s probably going to work\u201d, he said' 

_map = dict((c, r) for chars, r in CHARMAP for c in list(chars)) 
fixed = ''.join(_map.get(c, c) for c in text) 
print fixed 

輸出:

"it's probably going to work", he said 
相關問題