Чтение и перезапись файла в Python
В настоящее время я использую это:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
Но проблема в том, что старый файл больше, чем новый. Таким образом, я получаю новый файл, который имеет часть старого файла в конце.
Ответы
Ответ 1
Если вы не хотите закрывать и снова открывать файл, чтобы избежать условий гонки, вы можете 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()
Ответ 2
Вероятно, было бы проще и аккуратнее закрыть файл после text = re.sub('foobar', 'bar', text)
, повторно открыть его для записи (тем самым очистив старое содержимое) и записать в него свой обновленный текст.
Ответ 3
Модуль fileinput
имеет режим inline
для записи изменений в файл, который вы обрабатываете, без использования временных файлов и т.д. Модуль прекрасно инкапсулирует общую операцию циклирования по строкам в списке файлов через объект, который прозрачно отслеживает имя файла, номер строки и т.д., если вы хотите проверить их внутри цикла.
import fileinput
for line in fileinput.FileInput("file",inplace=1):
if "foobar" in line:
line=line.replace("foobar","bar")
print line
Ответ 4
Попробуйте записать его в новый файл.
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()