"gleichzeitig" in Datei schreiben und aus ihr lese

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
AndreasKersting
User
Beiträge: 2
Registriert: Donnerstag 31. August 2006, 18:25

Hallo liebe Leute!

Gestern habe ich mich zum ersten Mal mit Python beschäftigt und was ich bis jetzt sagen kann: super Sprache!

Allerdings habe ich bereits ein erstes kleines Problem was ich ohne eure Hilfe wohl nicht lösen kann:

Also, ich schreibe gerade ein Programm, mit dem ich Primzahlen "generieren" und Primfaktorzerlegung durchführen kann. Klappt soweit auch ganz gut, allerdings möchte ich das ganze noch ein wenig optimieren:

Dafür müsste ich eine Textdatei so öffnen/erstellen, dass ich in sie schreiben und auch gleichzeitig (also ohne zwischenzeitliches file.close()) aus ihr lesen könnte.

Der relevante (und wesentlich vereinfachte) Code:

Code: Alles auswählen

print "Bitte geben Sie den Namen der Ausgabedatei an."
out_file = raw_input("> ")
print
file = open(out_file,'w')
file.write('2\n')
file.write('3\n')
file.seek(0,0)
n = file.readline()
file.close()
Leider führt das zu einer Fehlermeldung:
Traceback (most recent call last):
File "./test", line 9, in ?
n = file.readline()
IOError: [Errno 9] Bad file descriptor
Gibt's eine Lösung für mein Problem und wenn ja, wie heißt sie?

Vielen Dank im Voraus.

MfG Andreas
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

bei öffnen der datei modus auf w+ oder r+ setzen

w+ wenn datei nicht existiert anlegen sonst lesen / schreiben
r+ wenn datei nicht existiert IOError
AndreasKersting
User
Beiträge: 2
Registriert: Donnerstag 31. August 2006, 18:25

Danke, jetzt funkt's! :D
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du solltest eine Variable nicht file nennen, da es eine Builtin-Funktion file gibt und diese somit überdeckt wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

DatenMetzgerX hat geschrieben:w+ wenn datei nicht existiert anlegen sonst lesen / schreiben
Hallo Andreas!

Die Datei wird in beiden Fällen neu angelegt (überschrieben). Ob sie existierte oder nicht, man fängt mit einer leeren Datei an.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Neg, wenn man eine existierende Datei mit 'r+' öffnet wird sie nicht überschrieben.

Code: Alles auswählen

>>> x = open('c:\Test.txt','r+')
>>> x.read()
'Hallo'
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Nirven hat geschrieben:Neg, wenn man eine existierende Datei mit 'r+' öffnet wird sie nicht überschrieben.
Moin Nirven,

bitte beachte, was ich zitiert habe:
DatenMetzgerX hat geschrieben:w+ wenn datei nicht existiert anlegen sonst lesen / schreiben
... und nicht die "r+"-Zeile

Mit "in beiden Fällen" meinte ich Existieren und nicht Existierten. :-)
Das sollte nur eine Ergänzung sein.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

*g*

Ah, das "in beiden" Fällen" hab ich mißverstanden. Hast natürlich recht, bei w+ wird immer neu angelegt.

'wenn datei nicht existiert anlegen sonst lesen schreiben' macht 'a+' (wie 'append'), wobei dann die Daten angehängt werden (welch Überraschung).
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi Nirven,

das hatte ich auch gedacht und mal ausprobiert. Aber die Funktionsweise finde ich etwas merkwürdig. Ich habe etwas in der Art geschrieben:
sDateiName = "test.tmp"

Code: Alles auswählen

fileDatei = open(sDateiName, "a+")
print fileDatei.tell()
print fileDatei.read()
print fileDatei.tell()
fileDatei.write("10")
fileDatei.close()
Beim ersten Testdurchlauf wurde nichts ausgegeben. Klar, die Datei wurde auch gerade erst angelegt.
Beim zweiten Durchlauf bekam ich aber meine 10! Wenn der Dateizeiger am ende steht, dürfte doch aber nichts eingelesen werden, oder? Laut dem ersten fileDatei.tell() befindet sich der Zeiger aber am Dateianfang. Außerdem wird dann nach dem Lesen beim Versuch zu schreiben eine IO-Exception geworfen.

Hat jemand eine Ahnung, warum?

Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Hi

Auszug aus der Doku zu 'a':
and 'a' opens it for appending (which on some Unix systems means that all writes append to the end of the file, regardless of the current seek position).
Also nur bei gewissen Unix Systemen, nicht bei allen und schon gar nicht auf Windows.

Aber die IOException weiss ich auch nicht warum.



Gruss
Nirven
User
Beiträge: 130
Registriert: Mittwoch 10. Mai 2006, 08:18
Wohnort: Bremerhaven

Hm, wenn ich eine Datei mit 'a+' öffne, was schreibe und dann direkt lese, steht da auf einmal seeeehr viel Müll in der Datei. 'a+' sollte man wohl wirklich nicht benutzen...
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hallo,

ich vermute, dass der Zeiger beim Öffnen auf 0 steht und vor dem ersten Schreiben ans Ende gerückt wird. Wenn ich vor dem Schreiben nichts lese, gibt es mit meinem Beispiel keine Probleme. Ich denke daher, dass das mit dem Sprung zum Dateiende nach dem Lesen nicht hinhaut.

Grüße,
Michael
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten