Datei oeffnen, Zeile veraendern

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
n0s
User
Beiträge: 2
Registriert: Montag 5. Dezember 2011, 21:56

Sehr geehrte Python Programmierer,

ich bin ein Neuling und komm bei einem Problem nicht weiter,, wäre echt froh, wenn mir jemand helfen könnte!

Folgendes Problem:

Ich lese eine Datei ein:

f = open ("C:/Users/Me/Desktop/beispiel.txt", "w")

und möchte die 12te Zeile verändern, in dem ich sie als String speichere, mit den verfügbaren Methoden verändere, anschließend möchte ich sie zurück in die 12te Zeile der Datei schreiben

Dann nurnoch
f.close()
und die 12te Zeile in beispiel.txt sollte geändert sein.

Ich habe jetzt über eine Schleife geschafft, die 12te Zeile in einen String zu speichern.

for i in range (0 , 11):
line = f.readline()

wenn ich dann line mit den string methoden bearbeitet habe, weiß ich nicht, wie ich sie zurückschreiben kann.
Hat jemand eine Idee?

Gruß
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Nur in wenigen Sonderfällen ist es möglich eine Zeile in einer Datei direkt zu verändern. Zum Beispiel dann, wenn du immer gleich viele Bytes in der Zeile hast. Wahrscheinlich ist das hier aber nicht der Fall. Dir bleibt also nichts weiter übrig als die vorhandene Datei einzulesen, die Zeile zu ändern und wieder in eine andere Datei zu schreiben. Am Ende löscht du die alte Datei und benennst die neue entsprechend um. Das kannst du alles mit Boardmitteln machen.

Noch ein kleiner Tipp: Am besten ist es, wenn du Dateien mit dem with-Statement öffnest (frag mal Google danach), dann vergisst du nicht die Datei zu schließen, auch wenn ein Fehler auftritt. Das ganze sieht dann in etwa so aus:

Code: Alles auswählen

with open("C:/Users/...", "w") as fp:
    fp.write("das ist ein test")
Dann brauchst du die Datei auch nicht mehr schließen. Das ganze geht natürlich auch verschachtelt:

Code: Alles auswählen

with open("quelle") as source:
    with open("ziel", "w") as destination:
        for line in source:
            destination.write("ziel")
Außerdem solltest du nicht versuchen die Datei mit dem "w"-Parameter zu lesen, dass löscht den gesamten Inhalt ;-)

Ein paar Tipps würden mir noch einfallen, aber versuche mal meinen Vorschlag umzusetzen. Am besten Postest du deine Lösung dann hier noch einmal, oder zumindest einen Ansatz, dann wirst du erfahrungsgemäß noch weitere nützliche Hinweise erhalten.

Sebastian
Das Leben ist wie ein Tennisball.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ergänzend zu EyDu: Du könntest `enumerate` verwenden, um einen Index zu generieren. Damit kannst Du dann abfragen, ob Du in der 12. Zeile bist und dort etwas geändertes in die neue Datei schreiben.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
n0s
User
Beiträge: 2
Registriert: Montag 5. Dezember 2011, 21:56

Hey,

Danke fuer die Antworten! Habe es jetzt soweit hinbekommen, dass es so laeuft, wie ich es mir vorgestellt habe. Eine Frage haette ich jedoch noch:

Ich oeffne immernoch meine Datei so:
f = open ("C:/Users/Me/Desktop/beispiel.txt", "w")
Ist es moeglich, dass ich den Dateinamen, hier:"beispiel" selber in Python generieren kann? Z.B. heissen alle Dateien im Ordner 1.txt, 2.txt, 3.txt usw. Kann ich praktisch die Dateien ueber eine Schleife oeffnen?
deets

Bitte gewoehn dir mal an, deinen Code in python-tags zu setzen, damit man den lesen kann.

Und klar kann man sowas machen. Entweder du baust dir die filenamen zusammen

Code: Alles auswählen

for i in xrange(10):
     print "datei_%i.txt" % i
Oder du kannst auch os.listdir verwenden, dann musst du noch nicht mal das machen. Oder das Modul glob.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

n0s hat geschrieben: Ich oeffne immernoch meine Datei so:
f = open ("C:/Users/Me/Desktop/beispiel.txt", "w")
Wieso? EyDu hatte Dir doch den idiomatischen Ansatz gezeigt!?
n0s hat geschrieben: Ist es moeglich, dass ich den Dateinamen, hier:"beispiel" selber in Python generieren kann? Z.B. heissen alle Dateien im Ordner 1.txt, 2.txt, 3.txt usw. Kann ich praktisch die Dateien ueber eine Schleife oeffnen?
Kannst Du machen. `xrange` in Python 2.x oder `range` in Python 3.x liefern Dir die benötigten Integerwerte. Du kannst das dann mittels String-Konkatenation zusammenbauen.

Beispiel:

Code: Alles auswählen

>>> for index in range(10):
...     print("{}.txt".format(index))
...
0.txt
1.txt
2.txt
3.txt
4.txt
5.txt
6.txt
7.txt
8.txt
9.txt
Allerdings mag es ja für Deinen Anwendungsfall besser sein, wenn Du die Dateien per Argumente beim Start des Scriptes übergibst. In diesem Falle nutze `sys.args` und iteriere darüber.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten