Найти - Пользователи
Полная версия: Замена русского текста в нескольких файлах в директории и поддиректориях
Начало » Python для новичков » Замена русского текста в нескольких файлах в директории и поддиректориях
1 2
alexpp
Добрый день!
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
Кто подскажет?
Так же есть задача в итоге заменить во всех подпапках много строк с русскими символами (глубина */index.html, */*/index.html, */*/*/index.html)
Буду очень признателен!
Заранее спасибо!
py.user.next
alexpp
Пытаюсь осилить написание простого скрипта для замены русских символов в html файле

Для начала пытаюсь хотя бы в одном файле:
Во-первых, декларация кодировки сверху вообще не нужна. В третьем питоне кодировка исходника по умолчанию utf-8. Во-вторых, при открытии файла в текстовом режиме нужно в функцию open() передавать параметр encoding, в котором и указывается кодировка открываемого файла.

Чтобы это всё знать, надо читать документацию к функции
python.org. open()
doza_and
py.user.next
функцию open() передавать параметр encoding
Добавлю что идеологически неправильно использовать open и передавать encoding. В заголовке html файла может быть указана произвольная кодировка. Если планируется писать надежный код то надо использовать инструменты которые будут использовать эту информацию. Например библиотеку lxml.

alexpp
так же есть задача в итоге заменить во всех подпапках много строк с русскими символами (глубина */index.html, */*/index.html, */*/*/index.html)

Тут я вообще не понял что вы хотите.
py.user.next
doza_and
Добавлю что идеологически неправильно использовать open и передавать encoding. В заголовке html файла может быть указана произвольная кодировка.
Я не заморачивался по поводу html, а только устранил ошибку топикстартера.

То, что это неправильно, это только кажется с первого взгляда. Кодировку в подаваемом файле можно прогарантировать заранее. Это либо перекодировать сам файл в кодировку utf-8 до преобразований над ним, либо продетектировать её, заглянув в файл на предварительном этапе.

doza_and
Например библиотеку lxml.
Во-первых, она сторонняя. Это не так уж важно, но всё же. Во-вторых, в диком мире можно вполне получить html-файл, который совсем не корректный html-документ. Я с таким сталкивался в реале, что замедлило проект с одного планируемого дня на это дело на пару недель, так как таких “файлов” там было много. На этом этапе lxml просто не может с ним работать, так как ждёт корректный документ на вход. В-третьих, разборка корректного html-файла в дерево, переделка дерева, и вывод дерева в текстовом виде не всегда гарантирует, что произойдут только те изменения в файле, которые нужны. Могут пропасть html-комментарии, могут пропасть лишние пробелы, которые там были и были нужны зачем-то, и так далее.
alexpp
Код изменил на with open ('/home/alex/SITE/index.html', ‘r’, encoding='windows-1251') (такой же как по умолчанию в моём html)
Проходит без ошибок, но ничего не делает.
Что ещё можно сделать?
py.user.next
alexpp
Проходит без ошибок, но ничего не делает.
Пиши в другой файл. Потом, после успешной записи, старый файл удаляй через os.remove(), а новый файл переименовывай в старый через os.rename().

И на каждом этапе ты можешь содержимое на экран выводить. А лучше вообще консоль питона открыть и вместо скрипта пройти всё по шагам, чтобы убедиться, что всё правильно читается и заменяется.
alexpp
py.user.next
Пиши в другой файл. Потом, после успешной записи, старый файл удаляй через os.remove(), а новый файл переименовывай в старый через os.rename().

Спасибо попробовал, но теперь в новом файле вместо всех символов :
 ЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅ

Если в html файле и в скрипте прописать utf-8, то тоже ничего не происходит.

С английскими символами никаких проблем нет - всё парсится и меняется.
Только кириллица проблемная
Сама ОС тоже файл открывает некорректно: (vim ~/SITE/index.html)
������ ���������� ������. ������� �����
Это может влиять ?

py.user.next
И на каждом этапе ты можешь содержимое на экран выводить. А лучше вообще консоль питона открыть и вместо скрипта пройти всё по шагам, чтобы убедиться, что всё правильно читается и заменяется.


Я действительно новичок в python. Это как?
Rafik
Если входной файл с кодировкой отличной от UTF8, то записываемый тоже должен быть с такой кодировкой. При открытии файла на запись тоже надо указать такую же кодировку.
Как предлагалось ранее, открытый файл распарсить и вытащить оттуда какая кодировка и при открытии файла на чтение и запись жёстко задавать ту кодировку, которая была изначально указана для файла.
Надёжнее будет писать в файл под другим именем (например, index.html.new) и потом удаление исходника с переименованием нового.
mitchelsamuel61
google
py.user.next
alexpp
Сама ОС тоже файл открывает некорректно:
Выполни
 cat file.html | hexdump -C
Просмотри его содержимое в 16-ричном виде.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB