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 textpierwszy, 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.
fileinputmoduł może stać się metodą preferowaną. Po przekazaniu inplace=1najpierw 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. :-)
fileinputModuł posiada inlinetryb 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()?