2010-06-02 3 views
5

W jaki sposób mogę zamienić ciąg znaków na inny ciąg, w obrębie danego pliku tekstowego. Czy po prostu przechodzę przez readline() i uruchamiam zamiennik podczas zapisywania do nowego pliku? Czy jest jakiś lepszy sposób?Zastępowanie ciągów w całym pliku tekstowym w Pythonie 3.x?

myślę że mógłby przeczytać całość na pamięć, ale szukam bardziej eleganckie rozwiązanie ...

góry dziękuję

+0

Czy istnieje szczególny powód, dla którego nie chcesz przechodzić przez linie? To prawdopodobnie najlepsze rozwiązanie. – cobbal

+0

Nie wiem ... Właśnie zastanawiałem się, czy jest lepszy sposób, jak sądzę. Zamiast tworzyć nowy plik i usuwać stary. –

+0

tworząc nowy plik usuwasz konieczność przechowywania całego pliku w pamięci ... a jeśli robisz re.sub powinieneś upewnić się, że najpierw używasz re.compile (a następnie użyj metody sub instancji zwróconej) –

Odpowiedz

10

fileinput to moduł ze standardowej biblioteki Python, który obsługuje "to, co wygląda na aktualizację plików tekstowych w miejscu", a także różne inne powiązane zadania.

for line in fileinput.input(['thefile.txt'], inplace=True): 
    print(line.replace('old stuff', 'shiny new stuff'), end='') 

Ten kod jest wszystko trzeba dla konkretnego zadania pan wspomniał - to dotyczy wszystkich kwestii (pisanie do innego pliku, usuwając starą Po zakończeniu i zastąpienie go nowym). Możesz również dodać kolejny parametr, taki jak backup='.bk', aby automatycznie zachować stary plik jako (w tym przypadku) thefile.txt.bk, a także przetwarzać wiele plików, przejmować nazwy plików do przetworzenia z wiersza poleceń, itp., - przeczytaj dokumenty, są całkiem dobre (tak samo sugeruję moduł!).

+2

Unikaj używania "print" i użyj "sys.stdout.write" zamiast tego, jeśli nie chcesz "drukować", aby dodać pustą linię i CTRL-M po każdej linii – Badisi

+0

@Badisi Możesz to zrobić, ustawiając "print" s parametr 'end', który domyślnie jest ustawiony na' \ n', na pusty ciąg znaków. Np .: 'print (line, end = '')'. Zobacz https://docs.python.org/3.3/library/functions.html#print –

4

Jeśli plik można odczytać w pamięci na raz, powiedziałbym, że

old = myfile.read() 
new = old.replace("find this", "replace by this") 
output.write(new) 

wynosi co najmniej może być trochę szybszy, ale w końcu to naprawdę nie ma znaczenia.