Вопрос к знатокам питона
Jul. 3rd, 2018 11:36 amДано: 3-й питон, юникодная строка, примерно до миллиона символов длиной.
Надо: преобразовать эту строку в произвольную 8-битную кодировку, заменяя все символы, отсутствубщие в данной кодировке на html-ные entities.
Как это быстрее всего сделать?
По идее питоновский стиль это "попытаться преобразовать, получить исключение, обработать".
Собственно, так и написал:
Но что-то скорость работы этой конструкции мне не нравится (даже на довольно быстрой моей рабочей станции миллион символов из которых только 7200 не представлены в целевой кодировке, жует 0.9 секунды).
Какие еще способы решения этой задачи можно предложить?
Надо: преобразовать эту строку в произвольную 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 секунды).
Какие еще способы решения этой задачи можно предложить?