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