Obecnie używam tego:
f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.close()
Problem polega jednak na tym, że stary plik jest większy niż nowy. W rezultacie otrzymuję nowy plik, który ma na końcu część starego pliku.
f.write(text)
późniejf.truncate()
?f.write(text)
jest przedf.truncate()
w tym kodzie; zapisujetext
pierwszy, więc po.write()
umieszczeniu kursora pliku na końcutext
. 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 przekazaniuinplace=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ówinode
, a nie całą zawartość. Następnie możesz czytać i przetwarzać każdą linię osobno, aby uniknąć nadmiaru pamięci. :-)Prawdopodobnie byłoby łatwiej i schludniej zamknąć plik później
text = re.sub('foobar', 'bar', text)
, ponownie otworzyć go do zapisu (usuwając w ten sposób starą zawartość) i zapisać w nim zaktualizowany tekst.źródło
fileinput
Moduł posiadainline
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.źródło
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.
źródło
Spróbuj zapisać go w nowym pliku ...
źródło