如何在python中编写自定义编码来清理我的数据?

时间:2011-04-28 13:43:39

标签: python encoding

我知道我之前在另一份工作上做过这件事,但我不记得我做了什么。

我有一个数据库,其中包含从Office,网页剪切和粘贴的varchar和备注字段,以及谁知道其他地方。这开始导致我的编码错误。由于Python有一个非常好的“解码”函数来获取字节流并将其转换为Unicode,我认为这只是编写我自己的编码来解决这个问题。 (例如,采用“智能引号”并将其转换为“标准引号”。)

但我不记得如何开始。我想我复制了一个关闭的编码(cp1252.py),然后更新了它。

有人能把我放在正确的道路上吗?或者建议一条更好的道路?

1 个答案:

答案 0 :(得分:3)

我对此进行了更详细的介绍。

如果您有理由确定数据库中文本的编码,则可以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