Ваш случай является частным случаем: 'newtext' имеет точно такое же количество символов, что и 'oldtext' .
Следовательно, можно использовать один из следующих кодов, чтобы точно заменить слово 'oldtext' или строку, в которой присутствует слово 'oldtext' , словом 'newtext' или строкой, в которой 'newtext' заменяет 'oldtext' .
.
Если файлы имеют не очень большой размер, содержимое каждого файла может быть полностью прочитано в память:
from os import fsync # code using find()
count = 0
for match in all_files('*.html', '.'):
with open(match,'rb+') as thefile:
diag = False
fno = thefile.fileno()
content = thefile.read()
thefile.seek(0,0)
x = content.find('oldtext')
while x>=0:
diag = True
thefile.seek(x,1)
thefile.write('newtext')
thefile.flush()
fsync(fno)
x = content[thefile.tell():].find('oldtext')
if diag:
cnt += 1
или
from os import fsync # code using a regex
import re
pat = re.compile('oldtext')
count = 0
for match in all_files('*.html', '.'):
with open(match,'rb+') as thefile:
diag = False
fno = thefile.fileno()
content = thefile.read()
thefile.seek(0,0)
prec = 0
for mat in pat.finditer(content):
diag = True
thefile.seek(mat.start()-prec,1)
thefile.write('newtext')
thefile.flush()
fsync(fno)
prec = mat.end()
if diag:
cnt += 1
.
Для тяжелых файловвозможна строка чтения и записи после строки:
from os import fsync # code for big files, using regex
import re
pat = re.compile('oldtext')
count = 0
for match in all_files('*.html', '.'):
with open(match,'rb+') as thefile:
diag = False
fno = thefile.fileno()
line = thefile.readline()
while line:
if 'oldtext' in line:
diag = True
thefile.seek(-len(line),1)
thefile.write(pat.sub('newtext',line))
thefile.flush()
fsync(fno)
line = thefile.readline()
if diag:
cnt += 1
.
Инструкции thefile.flush()
и fsync(fno)
необходимы после каждой записи, чтобы обработчик файлов thefile
указывает с точностью на точное положение в файле в любой момент.Они позволяют получить эффективную запись, упорядоченную по инструкции write()
flush () не обязательно записывает данные файла на диск.Используйте flush (), а затем os.fsync (), чтобы убедиться в этом.http://docs.python.org/library/stdtypes.html#file.flush
.
Эти программы делают минимум.Поэтому я думаю, что они быстрые.
.
Nota bene : файл, открытый в режиме 'rb+'
, не имеет изменения времени его последней модификации, если нет измененийбыло выполнено.