2011-08-25 22 views
10

Muszę przeczytać w pliku, zmienić fragmenty tekstu tu i tam, a następnie wypisać do tego samego pliku.Czytaj w pliku - zmień zawartość - zapisz do tego samego pliku

Obecnie robię:

f = open(file) 
file_str = f.read() # read it in as a string, Not line by line 
f.close() 
# 
# do_actions_on_file_str 
# 
f = open(file, 'w') # to clear the file 
f.write(file_str) 
f.close() 

Ale byłoby sobie wyobrazić, że jest tam więcej pythonic podejście, które daje ten sam rezultat.

Sugestie?

Odpowiedz

16

To już wydaje się proste i jasne. Każda sugestia zależy od wielkości plików. Jeśli nie naprawdę wielki, który wygląda dobrze. Jeśli naprawdę duże, można przetwarzać w porcjach.

Ale można użyć menedżera kontekstu, aby uniknąć wyraźnych zamknięć.

with open(filename) as f: 
    file_str = f.read() 

# do stuff with file_str 

with open(filename, "w") as f: 
    f.write(file_str) 
+3

Nie jestem pewien, czy generalnie sugerowałbym czytanie w trybie tekstowym i pisanie w systemie binarnym, chociaż robię to regularnie (w tym tylko wczoraj) . –

+0

@dash Oh tak, właśnie to wrzuciłem. To naprawdę nie robi żadnej różnicy na mojej platformie. ;-) – Keith

+0

tak, ale robi to różnicę z ciągami unicode. –

4

Jeśli pracujesz wiersz po wierszu można użyć fileinput z trybem reorganizacji w miejscu

import fileinput 

for line in fileinput.input(mifile, inplace=1): 
    print process(line) 

jeśli trzeba przetwarzać cały tekst od razu, wówczas kod może zostać zoptymalizowana trochę korzystając with że dba o zamknięciu plik:

with open(myfile) as f: 
    file_str = f.read() 
# 
do_actions_on_file_str 
# 
with open(myfile, 'w') as f: 
    f.write(file_str) 
+0

I faktycznie regex rzeczy, więc na cały plik. Widzę, jak moje pytanie nie odzwierciedla tego, że je zaktualizuję – pseudosudo

-3

jeśli trzeba przetwarzać cały tekst od razu, wówczas kod może zostać zoptymalizowana trochę korzystając z tym dba o zamknięciu pliku:

with open(myfile) as f: 
    file_str = f.read() 
# 
do_actions_on_file_str 
# 
with open(myfile, 'w') as f: 
    f.write(file_str) 
+1

Wygląda na to, że skopiowano odpowiedź, którą @joaquin opublikował w 2011 roku. –

Powiązane problemy