Python 2 in Textdokument schreiben

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
MrRatlos
User
Beiträge: 5
Registriert: Mittwoch 17. Dezember 2014, 07:48

Hallo,
ich möchte gerne in ein Textdokument schreiben. Es funktioniert aber nicht.

Code: Alles auswählen

from glob import glob
x = glob("/media/usb0/*.mp3")
y = open("/var/lib/mpd/playlists/Datenbank.m3u","w")
i = 1
for line in y:
    print line.rstrip()
    y.write(str(i) + ": " + line)
    i = i + 1
y.close()
Ich bekomme folgende Fehlermeldung:
Traceback (most recent call last):
File "test.py", line 5, in <module>
for line in y:
IOError: File not open for reading
:K
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@MrRatlos: man kann nicht Zeilenweise in eine Datei etwas einfügen, da sich ja alles nachfolgende verschieben würde. Der übliche Weg ist, eine neue Datei zu erzeugen, und diese gegebenenfalls danach umzubenennen.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Versteh ich das richtig, erst wird die Datei geleert und danach wird darauf zeilenweise zugegriffen, geht bestimmt alles super fix.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@MrRatlos: Nun, die Fehlermeldung ist doch recht eindeutig: Du versuchst aus einer Datei zu lesen die zum Schreiben geöffnet wurde.

Wobei das so sowieso nicht funktionieren würde, denn wenn man eine Datei mit dem Modus 'w' öffnet wird beim öffnen deren Inhalt gelöscht, da gibt es also gar nichts mehr was man lesen könnte.

Selbst wenn das funktionieren würde: Du liest zeilenweise und schreibst dann Daten die länger als die gelesene Zeile sind, also überschreibst Du Teile der nächsten Zeile, die Du aber noch gar nicht gelesen hast. Das Problem schlägt nicht sofort zu weil die Daten nicht wirklich zeilenweise aus der Datei gelesen werden sondern aus Effizienzgründen in grösseren Blöcken die im Arbeitsspeicher gepuffert werden, aber so ein Vorgehen wäre fehlerhaft. Üblicherweise liest man erst alle Zeilen in den Speicher und schreibt die Datei dann neu, oder man schreibt das Ergebnis in eine neue Datei und benennt die dann am Ende in die alte um. Und man macht die Umbenennung am Anfang und hat dann am Ende noch eine Sicherung der alten Datei.

Du solltest Dir ganz dringend jetzt am Anfang schon ordentliche Namen angewöhnen die dem Leser verraten was der Wert bedeutet der daran gebunden wird. Bei `x` und `y` denken die Leute an Koordinaten, also Zahlenwerte, aber nicht an eine Liste mit Pfaden oder ein Dateiobjekt beziehungsweise einen Iterator über Zeilen einer Datei.

Anstatt das `i` manuell hochzuzählen würde man eher die `enumerate()`-Funktion verwenden. Und das zusammensetzen von Werten und Zeichenketten mittels `str()` und ``+`` sieht mehr nach BASIC als nach Python aus. In Python gibt es für diese Aufgabe die `format()`-Methode auf Zeichenketten.
Antworten