Yanıtlar:
Yarış koşullarından kaçınmak için dosyayı kapatıp yeniden açmak istemiyorsanız şunları yapabilirsiniz truncate
:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()
İşlevsellik, bir hata oluşsa bile dosya işleyicisini kapatan bir bağlam yöneticisi olarak kullanıldığında büyük olasılıkla daha temiz ve daha güvenliopen
olacaktır!
with open(filename, 'r+') as f:
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.write(text)
önce gelir f.truncate()
; text
ilkini yazar , bu yüzden .write()
dosya imleci sonuna yerleştirildikten sonra text
. Dosyayı kesmeye devam etmek, dosyanın bu noktadan sonra sahip olabileceği kalan baytları kaldıracaktır. Bu durumda, sonuç, yazmadan önce kısaltmanızla aynı olacaktır.
fileinput
modül tercih edilen yöntem haline gelebilir. Geçildiğinde inplace=1
, dosyayı önce geçici bir konuma taşıyacak, ardından eski dosya adı yoluna yeni bir dosya yazacaktır. Bu taşıma işlemi, unix dosya sistemlerinde hızlıdır, çünkü inode
tüm içeriği değil, sadece dosya sistemini taşır . Ardından, bellek şişkinliğini önlemek için her satırı ayrı ayrı okuyabilir ve işleyebilirsiniz. :-)
fileinput
Modülü vardır inline
, şeffaf dosya adının izler bir nesne aracılığıyla, modül güzel dosyaların listesini satırların üzerinde döngü ortak çalışmasını kapsüller geçici dosyaları kullanmadan vb olmadan işliyoruz dosyada değişiklik yazmak için modu döngü içinde incelemek isterseniz satır numarası vb.
import fileinput
for line in fileinput.FileInput("file",inplace=1):
if "foobar" in line:
line=line.replace("foobar","bar")
print line
Dürüst olmak gerekirse, temel dosya işlemlerini yapan, oluşturduğum bu sınıfa bir göz atabilirsiniz. Yazma yöntemi üzerine yazar ve ekleme, eski verileri korur.
class IO:
def read(self, filename):
toRead = open(filename, "rb")
out = toRead.read()
toRead.close()
return out
def write(self, filename, data):
toWrite = open(filename, "wb")
out = toWrite.write(data)
toWrite.close()
def append(self, filename, data):
append = self.read(filename)
self.write(filename, append+data)
f.write(text)
sonrası olmalıf.truncate()
mı?