Как написать пользовательскую кодировку в Python для очистки моих данных? - PullRequest
2 голосов
/ 28 апреля 2011

Я знаю, что делал это раньше на другой работе, но не могу вспомнить, что я сделал.

У меня есть база данных, которая заполнена полями varchar и memo-полей, которые были вырезаны и вставлены из Office, веб-страниц и кто знает, где еще. Это начинает вызывать ошибки кодирования для меня. Так как в Python есть очень хорошая функция «декодирования», которая берет поток байтов и переводит его в Unicode, я подумал, что просто напишу свою собственную кодировку, чтобы исправить это. (Например, чтобы взять «умные цитаты» и превратить их в «стандартные цитаты».)

Но я не могу вспомнить, с чего начать. Я думаю, что я скопировал одну из кодировок, которая была близка (cp1252.py), а затем обновил ее.

Может кто-нибудь поставить меня на правильный путь? Или предложить лучший путь?

1 Ответ

3 голосов
/ 28 апреля 2011

Я расширил это немного подробнее.

Если вы достаточно уверены в кодировке текста в базе данных, вы можете сделать text.decode('cp1252'), чтобы получить строку Unicode. Если предположение неверно, это, скорее всего, взорвется исключением, или декодер «пропадет» с некоторыми символами.

Создание декодера в соответствии с описанными вами линиями (изменение cp1252.py) очень просто. Вам просто нужно определить таблицу перевода из байтов в символы Юникода.

Однако, если не весь текст в базе данных имеет одинаковую кодировку, вашему декодеру понадобятся некоторые правила, чтобы решить, какое отображение является правильным. В этом случае вы можете использовать команду punt и использовать *1001* модуль chardet , который может сканировать текст и угадывать кодировку.

Возможно, лучшим подходом будет попытка декодирования с использованием наиболее вероятной кодировки (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...