Seite 1 von 1

Dateien lesen

Verfasst: Mittwoch 2. Februar 2011, 10:41
von Ghillie_Suit
Hallo allerseits, ich habe geradenein programm geschrieben, dass mir den Inhalt einer txt datei ausgeben soll.
nur leider funktioniert es nicht :cry: und ich habe keinen blassen schimmer was ich falsch mache und im turtorial finde ich auch nichts dazu.

Code: Alles auswählen

outfile=open('test.txt', "a")
outfile.write("Moin !!")
text=outfile.readline()
print(text)
outfile.close()

Re: Dateien lesen

Verfasst: Mittwoch 2. Februar 2011, 10:47
von snafu
Wenn du die Datei lesen willst, darfst du sie eben nicht mit 'a' oder 'w' öffnen, sondern musst 'r' nutzen. Außerdem sollte man Dateien spätestens seit Python 2.6 mit dem with-Statement öffnen:

Code: Alles auswählen

>>> with open('test.txt', 'w') as f:
    f.write('bla')
...     
...     
>>> with open('test.txt', 'a') as f:
    f.write('blupp')
...     
...     
>>> with open('test.txt') as f:
    f.read()
...     
...     
'blablupp'
Damit ist garantiert, dass die Datei in jedem Fall wieder geschlossen wird und du sparst etwas Boilerplate-Code ein.

Übrigens, man konnte es zwar jetzt erraten, aber du solltest dir angewöhnen neben dem verwendeten Code auch die auftretende Fehlermeldung mitzuposten. Wenn du sie dann noch vorher selbst liest, kommst du der Antwort meist noch näher. :)

Re: Dateien lesen

Verfasst: Mittwoch 2. Februar 2011, 11:12
von /me
snafu hat geschrieben:Wenn du die Datei lesen willst, darfst du sie eben nicht mit 'a' oder 'w' öffnen, sondern musst 'r' nutzen.
Na ja, "w+" oder "a+" geht natürlich auch. Ich habe da übrigens mal einen merkwürdigen Effekt im Angebot der mir aufgefallen ist als ich mit dem Code etwas gespielt habe:

Code: Alles auswählen

with open('test.txt', 'a+') as fp:
    fp.write('Foo')
    fp.seek(0)
    line = fp.readline()
print line
Das funktioniert wie zu erwarten ganz prima. Jetzt kommentiere ich die Zeile mit dem seek() aus und erhalte plötzlich in der Zieldatei Fragmente des gerade ausgeführten Sourcecodes (Python 2.6.5).

Code: Alles auswählen

Foo8=n('test.txt', 'a+') as fp:
Kann jemand das Verhalten nachvollziehen und/oder erklären?

Re: Dateien lesen

Verfasst: Mittwoch 2. Februar 2011, 11:46
von sparrow
Der Dateizeiger steht ja am Ende der Datei. Wenn er nicht zurückgesetzt wird liest er auch dort weiter. Was da steht ist halt davon abhängig was im nächsten Feld der Festplatte steht, würde ich annehmen.

Re: Dateien lesen

Verfasst: Mittwoch 2. Februar 2011, 12:31
von BlackJack
@sparrow: Das erklärt *was* da passiert, aber nicht warum. Wenn der Dateizeiger am Ende der Datei steht, dann liefert ein Lesevorgang normalerweise nichts, weil eben nichts mehr da steht. Es wird nicht einfach sequentiell auf der Platte oder aus dem Pufferspeicher irgendwelcher Datenmüll geliefert.

Re: Dateien lesen

Verfasst: Mittwoch 2. Februar 2011, 14:30
von mkesper
/me: kannst du das mit 2.6.6 reproduzieren? Wäre IMHO ein Bug.

Re: Dateien lesen

Verfasst: Mittwoch 2. Februar 2011, 14:35
von Xynon1
Ist in 2.6.6 und 2.7.1 das selbe, in Python 3.1.3 passiert das nicht mehr.

Re: Dateien lesen

Verfasst: Mittwoch 2. Februar 2011, 14:38
von sparrow
Ohne wirklich viel getestet zu haben:

read() verhält sich entgegen readline() wie erwartet und liefert eine leere Zeichenkette.

ein flush() vor dem readline() scheint das Problem ebenfalls zu beheben.

Re: Dateien lesen

Verfasst: Mittwoch 2. Februar 2011, 14:49
von Xynon1
sparrow hat geschrieben:read() verhält sich entgegen readline() wie erwartet und liefert eine leere Zeichenkette.

Also bei mir nicht, sowohl read, readlines als auch readline liefern unter Python 2.6.6/2.7.1 keinen leeren Wert. Unter Python 3.1.3 liefert read und readlines den kompletten Dateinhalt und readline die erste Zeile. Ein flush, führt logischerweise in jedem Fall zu einem leeren Wert.