В настоящее время я использую это:
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
, а не все содержимое. Затем вы можете читать и обрабатывать каждую строку отдельно, чтобы избежать раздува памяти. :-)