Seite 1 von 1

"gleichzeitig" in Datei schreiben und aus ihr lese

Verfasst: Donnerstag 31. August 2006, 18:59
von AndreasKersting
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

Verfasst: Donnerstag 31. August 2006, 19:20
von DatenMetzgerX
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

Verfasst: Donnerstag 31. August 2006, 19:25
von AndreasKersting
Danke, jetzt funkt's! :D

Verfasst: Donnerstag 31. August 2006, 21:06
von Leonidas
Du solltest eine Variable nicht file nennen, da es eine Builtin-Funktion file gibt und diese somit überdeckt wird.

Verfasst: Donnerstag 31. August 2006, 22:53
von Michael Schneider
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

Verfasst: Freitag 1. September 2006, 05:03
von Nirven
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'

Verfasst: Freitag 1. September 2006, 06:25
von Michael Schneider
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

Verfasst: Freitag 1. September 2006, 06:50
von Nirven
*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).

Verfasst: Freitag 1. September 2006, 07:10
von Michael Schneider
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

Verfasst: Freitag 1. September 2006, 07:27
von rayo
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

Verfasst: Freitag 1. September 2006, 08:20
von Nirven
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...

Verfasst: Freitag 1. September 2006, 11:28
von Michael Schneider
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