Прочитать и переписать файл в Python - PullRequest
91 голосов
/ 11 марта 2010

В настоящее время я использую это:

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()

Но проблема в том, что старый файл больше нового.В итоге я получаю новый файл, в конце которого есть часть старого файла.

Ответы [ 4 ]

162 голосов
/ 11 марта 2010

Если вы не хотите закрывать и снова открывать файл, чтобы избежать условий гонки, вы можете truncate it:

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()
15 голосов
/ 11 марта 2010

Возможно, было бы проще и аккуратнее закрыть файл после text = re.sub('foobar', 'bar', text), заново открыть его для записи (таким образом очистив старое содержимое) и записать в него обновленный текст.

14 голосов
/ 11 марта 2010

Модуль fileinput имеет режим inline для записи изменений в файл, который вы обрабатываете, без использования временных файлов и т. Д. Модуль красиво инкапсулирует обычную операцию зацикливания строк в списке файлов, через объект, который прозрачно отслеживает имя файла, номер строки и т. д., если вы хотите проверить их внутри цикла.

import fileinput
for line in fileinput.FileInput("file",inplace=1):
    if "foobar" in line:
         line=line.replace("foobar","bar")
    print line
0 голосов
/ 29 июня 2016

Попробуйте записать его в новый файл ..

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()
...