Чтение и перезапись файла в Python
В настоящее время я использую это:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
но проблема в том, что старый файл больше, чем новый файл. Поэтому я получаю новый файл, в конце которого есть часть старого файла.
4 ответов
если вы не хотите, чтобы закрыть и открыть файл, чтобы избежать условий гонки, вы могли бы truncate
это:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()
функциональность также может быть чище и безопаснее используя with open as
в комментарии mVChr, который закроет обработчик, даже если произойдет ошибка.
with open(filename, 'r+') as f:
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
вероятно, было бы проще и аккуратнее закрыть файл после text = re.sub('foobar', 'bar', text)
, повторно откройте его для записи (таким образом, очистив старое содержимое) и напишите в него обновленный текст.
на fileinput
модуль inline
режим для записи изменений в файл обрабатывается без использования временных файлов и т. д. Модуль красиво инкапсулирует общую операцию зацикливания строк в списке файлов через объект, который прозрачно отслеживает имя файла, номер строки и т. д., Если вы хотите проверить их внутри цикла.
import fileinput
for line in fileinput.FileInput("file",inplace=1):
if "foobar" in line:
line=line.replace("foobar","bar")
print line
попробуйте записать его в новый файл..
f = open(filename, 'r+')
f2= open(filename2,'a+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.close()
f2.write(text)
fw.close()