2010-03-11 8 views
83

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

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

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

ответ

142

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

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

Функциональность может быть также cleaner and safer с помощью 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() 
+9

Спасибо и хороший ответ. Я также хотел бы отметить здесь, что наилучшей практикой является открытие файла в 'с открытым (имя файла, 'r +') как f:' block, таким образом он автоматически закрывает файл в конце блока, даже если есть исключение , – mVChr

14

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

14

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

import fileinput 
for line in fileinput.FileInput("file",inplace=1): 
    if "foobar" in line: 
     line=line.replace("foobar","bar") 
    print line 
-3

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

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() 
Смежные вопросы