Odpowiedzi:
Jeśli nie chcesz zamykać i ponownie otwierać pliku, aby uniknąć warunków wyścigu, możesz truncate
:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()
Funkcjonalność prawdopodobnie będzie również czystsza i bezpieczniejsza,open
gdy będzie używana jako menedżer kontekstu, co zamknie program obsługi plików, nawet jeśli wystąpi błąd!
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)
jest przed f.truncate()
w tym kodzie; zapisuje text
pierwszy, więc po .write()
umieszczeniu kursora pliku na końcu text
. Kontynuowanie obcięcia pliku spowoduje usunięcie wszelkich pozostałych bajtów, które plik może mieć po tym momencie. W takim przypadku wynik końcowy byłby taki sam, jak w przypadku obcięcia przed zapisaniem.
fileinput
moduł może stać się metodą preferowaną. Po przekazaniu inplace=1
najpierw przeniesie plik do tymczasowej lokalizacji, a następnie zapisze nowy plik w starej ścieżce do pliku. Ta operacja przenoszenia jest szybka na unixowych systemach plików, ponieważ przenosi tylko system plików inode
, a nie całą zawartość. Następnie możesz czytać i przetwarzać każdą linię osobno, aby uniknąć nadmiaru pamięci. :-)
fileinput
Moduł posiada inline
tryb pisania zmiany w pliku jesteś przetwarzania bez użycia plików tymczasowych itd. Moduł ładnie obudowuje wspólne działanie pętli na liniach w liście plików za pośrednictwem obiektu, który przejrzyście śledzi nazwy pliku, numer linii itp., jeśli chcesz sprawdzić je wewnątrz pętli.
import fileinput
for line in fileinput.FileInput("file",inplace=1):
if "foobar" in line:
line=line.replace("foobar","bar")
print line
Szczerze, możesz rzucić okiem na tę klasę, którą zbudowałem, która wykonuje podstawowe operacje na plikach. Metoda write zastępuje i dołącza stare dane.
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)
późniejf.truncate()
?