2015-12-30 1 views
-2

Я пытаюсь сравнить две арабские строки, используя модуль difflib.HtmlDiff python. Я просмотрел различные способы записи выходов из файла HtmlDiff в файл, но ни один из них не работает для меня. Методы я пытался до сих пор:Не удалось написать вывод HtmlDiff, содержащий текст unicode в python 3

Примечание: во всех последующих фрагментах коды, original и mockinputs списков строк, в соответствии с требованиями HtmlDiff, текст Unicode, в частности, арабское.

Method 1
import difflib 

hdiff = difflib.HtmlDiff() 
html = hdiff.make_file(original, mockinputs) 

with open('out_file.html', 'w', encoding='utf-8') as out_file: 
    out_file.write(html) 

Это выполняется без ошибок, но HTML-файл, созданный тарабарщина (вещи, как الرحÙ) при открытии в браузере.

Method 2 (как было указано here)
import difflib 

htmldiff = difflib.HtmlDiff() 
html = htmldiff.make_file(original, mockinputs) 

out_file = open('out_file.html', 'w') 
out_file.write(html.encode('utf-8')) 
out_file.close() 

Это дает мне эту ошибку:

TypeError: must be str, not bytes

Итак, как я могу писать Unicode тексты, подготовленные HtmlDiff, как показано здесь HTML-файл в Python 3 ?

Я использую python 3.4.3.

+0

Это предположение, но в документации для 'difflib' говорится, что метод' make_file' был изменен для Python 3.5 для кодировки по умолчанию «utf-8»: https://docs.python.org/ 3/library/difflib.html # difflib.HtmlDiff.make_file Пробовал ли вы это в Python3.5? Если бы мне пришлось делать ставки, я бы посмотрел на этот метод 'make_file' как на виновника. Кроме того, ваши первые две попытки делают то же самое, и можете ли вы заставить 'difflib' работать без создания таблицы HTML? – erewok

+0

Спасибо, что указали на это новое изменение в 3.5. Я думаю, что это билет :-) Но посмотрим, что еще появляется! –

+1

В документации, приведенной выше, говорится, что 'make_file' имел стандартную кодировку' ISO-8859-1', которая не включала бы арабский. Кроме того, большинство браузеров собираются увидеть «ISO-8859-1» и вернуться к ASCII (по крайней мере, они привыкли). Таким образом, вы должны использовать Python3.5 или генерировать результат самостоятельно. (Nevermind, вы его нашли ...) – erewok

ответ

1

According to the documentation, метод make_file в версиях Python до того, как Python3.5 по умолчанию не соответствует кодировке ISO-8859-1, которая не включает арабский язык.

Далее, большинство браузеров собираются увидеть ISO-8859-1 и вернуться к ASCII. Таким образом, вы должны использовать этот метод в Python3.5, чтобы получить utf-8 или сгенерировать выходные данные HTML, которые вы хотели бы по-другому.

Edit:, как питон 3.5.1, хотя метод make_html использует по умолчанию кодировка UTF-8, метод его брат make_table не делает, поэтому позаботьтесь с использованием последнего!