Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет Журнал Витуса. ([info]lj_vitus_wagner)
@ 2018-07-03 08:46:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Вопрос к знатокам питона
Дано: 3-й питон, юникодная строка, примерно до миллиона символов длиной.
Надо: преобразовать эту строку в произвольную 8-битную кодировку, заменяя все символы, отсутствубщие в данной кодировке на html-ные entities.

Как это быстрее всего сделать?

По идее питоновский стиль это "попытаться преобразовать, получить исключение, обработать".
Собственно, так и написал:
from html.entities import codepoint2name

complete=False
while not complete:
    try:
        binary=data.encode(output_encoding)
        out += binary
        complete=True
    except UnicodeEncodeError as e:
        badchar = data[e.start]
        out +=data[:e.start].encode(output_encoding)
        data=data[e.start+1:]
        if ord(badchar) in codepoint2name:
            out+=b'&'+codepoint2name[ord(badchar)].encode("ascii")+b';';
        else:
            out+=b"&#%d;"%ord(badchar);


Но что-то скорость работы этой конструкции мне не нравится (даже на довольно быстрой моей рабочей станции миллион символов из которых только 7200 не представлены в целевой кодировке, жует 0.9 секунды).

Какие еще способы решения этой задачи можно предложить?

This entry was originally posted at https://vitus-wagner.dreamwidth.org/2007514.html. Please comment there using OpenID. Now there are Image comments


(Читать комментарии) (Добавить комментарий)