Вы не указываете, что файлы находятся в utf-16 LE при чтении содержимого - вот и возникает путаница при попытке чтения и записи в один и тот же файл одновременно, что не сработает.
Кроме того, если вы не запускаете этот код на сервере, где можно предпринять попытку атаки, отправив вам чрезмерно большой текстовый файл, вам не следует беспокоиться о размере файла, а просто прочитайте все содержимое файла сразу.
(Чтобы у вас была идея, Библия, которая является большой книгой, имеет размер порядка 3 МБ (с 8-битной кодировкой) - и даже небольшие VPS-серверы будут иметь порядка 200 МБ памяти, доступной для вашей программы - то есть вы можете конвертировать книгу размером более 30 + библий одновременно). Типичные настольные компьютеры имеют в несколько раз больше памяти.
Кроме того, относительно недавняя библиотека «pathlib» Python может облегчить разбиение по всем вашим текстовым файлам, а ее методы Path.read_text
и Path.write_text
откроют файл, прочитают или запишут содержимое в правильной кодировке и закроют его. в одном выражении. Поскольку при использовании этого метода на момент записи файла чтение уже будет выполнено, мы можем просто сделать это двумя вызовами:
import pathlib
for filepath in pathlib.Path(".").glob("**/*.txt"):
data = filepath.read_text(encoding="utf-16 LE")
filepath.write_text(data, encoding="utf-8")
Если вы предпочитаете быть в безопасности, в очень, очень маловероятном случае катастрофического сбоя компьютера в середине преобразования файла, вы можете записать в файл с другим именем и впоследствии выполнить удаление / переименование - так код такой:
import pathlib
for filepath in pathlib.Path(".").glob("**/*.txt"):
data = filepath.read_text(encoding="utf-16 LE")
tmp_name = filepath.name + ".tmp"
filepath.with_name(tmp_name).write_text(data, encoding="utf-8")
filepath.unlink()
filepath.with_name(tmp_name).rename(filepath.name)