Форум сайта python.su
0
Добрый день!
1. Версия питона Python 3.6.9
2. Description: Ubuntu 18.04.3 LTS Release: 18.04 Codename: bionic
3. locale -a
C
C.UTF-8
en_US.utf8
POSIX
ru_RU.utf8
ru_UA.utf8
Пытаюсь осилить написание простого скрипта для замены русских символов в html файле
Для начала пытаюсь хотя бы в одном файле:
# -*- coding: utf-8 -*- with open ('/home/alex/SITE/index.html', 'r') as f: old_data = f.read() new_data = old_data.replace('Адес ', 'Адрес редакции') with open ('/home/alex/SITE/index.html', 'w') as f: f.write(new_data)
Traceback (most recent call last): File "replace.py", line 4, in <module> old_data = f.read() File "/usr/lib/python3.6/codecs.py", line 321, in decode (result, consumed) = self._buffer_decode(data, self.errors, final) UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc3 in position 212: invalid continuation byte
Отредактировано alexpp (Фев. 3, 2020 09:38:24)
Офлайн
857
alexppВо-первых, декларация кодировки сверху вообще не нужна. В третьем питоне кодировка исходника по умолчанию utf-8. Во-вторых, при открытии файла в текстовом режиме нужно в функцию open() передавать параметр encoding, в котором и указывается кодировка открываемого файла.
Пытаюсь осилить написание простого скрипта для замены русских символов в html файле
Для начала пытаюсь хотя бы в одном файле:
Офлайн
253
py.user.nextДобавлю что идеологически неправильно использовать open и передавать encoding. В заголовке html файла может быть указана произвольная кодировка. Если планируется писать надежный код то надо использовать инструменты которые будут использовать эту информацию. Например библиотеку lxml.
функцию open() передавать параметр encoding
alexpp
так же есть задача в итоге заменить во всех подпапках много строк с русскими символами (глубина */index.html, */*/index.html, */*/*/index.html)
Офлайн
857
doza_andЯ не заморачивался по поводу html, а только устранил ошибку топикстартера.
Добавлю что идеологически неправильно использовать open и передавать encoding. В заголовке html файла может быть указана произвольная кодировка.
doza_andВо-первых, она сторонняя. Это не так уж важно, но всё же. Во-вторых, в диком мире можно вполне получить html-файл, который совсем не корректный html-документ. Я с таким сталкивался в реале, что замедлило проект с одного планируемого дня на это дело на пару недель, так как таких “файлов” там было много. На этом этапе lxml просто не может с ним работать, так как ждёт корректный документ на вход. В-третьих, разборка корректного html-файла в дерево, переделка дерева, и вывод дерева в текстовом виде не всегда гарантирует, что произойдут только те изменения в файле, которые нужны. Могут пропасть html-комментарии, могут пропасть лишние пробелы, которые там были и были нужны зачем-то, и так далее.
Например библиотеку lxml.
Отредактировано py.user.next (Фев. 4, 2020 03:39:55)
Офлайн
0
Код изменил на with open ('/home/alex/SITE/index.html', ‘r’, encoding='windows-1251') (такой же как по умолчанию в моём html)
Проходит без ошибок, но ничего не делает.
Что ещё можно сделать?
Офлайн
857
alexppПиши в другой файл. Потом, после успешной записи, старый файл удаляй через os.remove(), а новый файл переименовывай в старый через os.rename().
Проходит без ошибок, но ничего не делает.
Отредактировано py.user.next (Фев. 4, 2020 07:51:59)
Офлайн
0
py.user.next
Пиши в другой файл. Потом, после успешной записи, старый файл удаляй через os.remove(), а новый файл переименовывай в старый через os.rename().
ЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ
py.user.next
И на каждом этапе ты можешь содержимое на экран выводить. А лучше вообще консоль питона открыть и вместо скрипта пройти всё по шагам, чтобы убедиться, что всё правильно читается и заменяется.
Отредактировано alexpp (Фев. 4, 2020 08:10:04)
Офлайн
27
Если входной файл с кодировкой отличной от UTF8, то записываемый тоже должен быть с такой кодировкой. При открытии файла на запись тоже надо указать такую же кодировку.
Как предлагалось ранее, открытый файл распарсить и вытащить оттуда какая кодировка и при открытии файла на чтение и запись жёстко задавать ту кодировку, которая была изначально указана для файла.
Надёжнее будет писать в файл под другим именем (например, index.html.new) и потом удаление исходника с переименованием нового.
Отредактировано Rafik (Фев. 4, 2020 08:56:05)
Офлайн
0
Офлайн
857
alexppВыполни
Сама ОС тоже файл открывает некорректно:
cat file.html | hexdump -C
Офлайн