В настоящее время я использую это:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
Но проблема в том, что старый файл больше нового. Итак, у меня получается новый файл, в конце которого есть часть старого.
f.write(text)
послеf.truncate()
?f.write(text)
стоит передf.truncate()
этим кодом; он записываетtext
первый, поэтому после того,.write()
как курсор файла помещается в конецtext
. Продолжение усечения файла приведет к удалению всех оставшихся байтов, которые могут быть у файла после этого момента. В этом случае конечный результат будет таким же, как при усечении перед записью.fileinput
модуль может стать предпочтительным методом. При передачеinplace=1
он сначала переместит файл во временное расположение, а затем запишет новый файл по старому пути к имени файла. Эта операция перемещения выполняется быстро в файловых системах unix, поскольку перемещает только файловую системуinode
, а не все содержимое. Затем вы можете читать и обрабатывать каждую строку отдельно, чтобы избежать раздува памяти. :-)Вероятно, было бы проще и аккуратнее закрыть файл после этого
text = re.sub('foobar', 'bar', text)
, повторно открыть его для записи (таким образом очистив старое содержимое) и записать в него обновленный текст.источник
В
fileinput
модуле естьinline
режим для записи изменений в файл, который вы обрабатываете, без использования временных файлов и т. Д. Модуль прекрасно инкапсулирует обычную операцию перебора строк в списке файлов с помощью объекта, который прозрачно отслеживает имя файла, номер строки и т. д., если вы хотите проверить их внутри цикла.источник
Честно говоря, вы можете взглянуть на этот созданный мной класс, который выполняет основные файловые операции. Метод записи перезаписывает и добавляет старые данные.
источник
Попробуйте записать его в новый файл ..
источник