Zeile in Datei ersetzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
fab
User
Beiträge: 8
Registriert: Mittwoch 13. Juni 2007, 22:06
Wohnort: Bern

Mittwoch 27. Juni 2007, 13:49

Hallo zusammen

In einem Konfigurations-File steht in einer Zeile "enable = 0". Nun möchte ich diese Zeile auf "enable = 1" ändern. Später natürlich auch noch umgekehrt von 1 auf 0. In meinem Skript habe ich wohl einen Denkfehler, denn der Zugriffzeitpunkt auf die Datei wird aktualisiert, aber sonst passiert nichts, obwohl die Zeichenfolgen (das Ergänzen von \n hat keine Auswirkungen) exakt übereinstimmen. Ich nehme an, dass ich mit der Schlaufe alle ins Nirwana schicke.

Code: Alles auswählen

import fileinput, string, sys

search_text = "enable = 0"
replace_text = "enable = 1"

# leere Zeilen uebergehen und dann suchen/ersetzen
for line in fileinput.input("test1.txt",inplace=1):
   lineno = 0
   lineno = string.find(line, search_text)
   if lineno >= 0: 
        line = line.replace(search_text, replace_text)
   sys.stdout.write(line)
Ich habe mir auch überlegt, dass ich mit seek arbeiten könnte, jedoch scheint mir diese Möglichkeit hier für ein später Recyclen fast besser geeignet.

Vielen Dank und Gruss

Fabian
BlackJack

Mittwoch 27. Juni 2007, 16:41

Das `find()` führt nie zum Erfolg weil Du die Zeile im Suchtext suchst und nicht umgekehrt.

Davon abgesehen, dass `lineno` irgendwie "Zeilennummer" suggeriert und nicht den Index und das die Bindung an 0 überflüssig ist, solltest Du einfach ersetzen ohne zu suchen. Das ist schneller, weil beim Ersetzen sowieso gesucht werden muss. Wenn Du also selber suchst, wird einmal umsonst gesucht.
fab
User
Beiträge: 8
Registriert: Mittwoch 13. Juni 2007, 22:06
Wohnort: Bern

Mittwoch 27. Juni 2007, 17:52

Hallo BlackJack

Vielen Dank für Deine Hinweise. Ich habe mich von zu fest auf die Python Referenz abgestützt und lineno falsch interpretiert. Die Argumente bei find() waren falsch, aber wie Du gesagt hast, kann man das ganze auf den Code unten verkürzen.

Code: Alles auswählen

import fileinput, sys

search_text = "enable = 1"
replace_text = "enable = 0"

for line in fileinput.input("test1.txt",inplace=1):
     line = line.replace(search_text, replace_text)
     sys.stdout.write(line)
Da der Wert bei "enable" grundsätzlich bekannt ist, kann ich auch auf die Prüfung verzichten. Wenn "enable = 0" ist, dann läuft das Skript einfach durch ohne Abbruch. Ok, ist sicher etwas unschön in den Augen eines erfahrenen Python-Programmier, aber für mich reicht es, wenn ich zu einem späteren Zeichpunkt, falls es nötig ist, die beiden Texte tausche.

Gruss Fabian
Antworten