Odczyt i nadpisanie pliku w Pythonie

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()

Ale problem polega na tym, że stary plik jest większy niż nowy. Więc kończę z nowym plikiem, który ma część starego pliku na końcu.

Author: compie, 2010-03-11

4 answers

Jeśli nie chcesz zamknąć i ponownie otworzyć pliku, aby uniknąć warunków wyścigu, możesz truncate IT:

f = open(filename, 'r+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.write(text)
f.truncate()
f.close()

Funkcjonalność może być równieżczystsza i bezpieczniejsza używając with open as na komentarz mVChr, który spowoduje zamknięcie obsługi, 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()
 149
Author: nosklo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:54:47

Prawdopodobnie łatwiej byłoby zamknąć plik po text = re.sub('foobar', 'bar', text), ponownie otworzyć go do zapisu (wyczyszczenie starej zawartości) i napisać do niego zaktualizowany tekst.

 15
Author: Il-Bhima,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-11 10:04:09

The fileinput moduł posiada tryb inline do zapisu zmian w przetwarzanym pliku bez użycia plików tymczasowych itp. Moduł ładnie hermetyzuje powszechną operację zapętlania linii na liście plików, za pomocą obiektu, który przejrzyście śledzi nazwę pliku, numer linii itp., Jeśli chcesz je sprawdzić 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
 14
Author: ghostdog74,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-11 05:54:44

Spróbuj zapisać go w Nowym pliku..

f = open(filename, 'r+')
f2= open(filename2,'a+')
text = f.read()
text = re.sub('foobar', 'bar', text)
f.seek(0)
f.close()
f2.write(text)
fw.close()
 -2
Author: sk7979,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-29 11:59:40