Dateien lesen

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
Ghillie_Suit
User
Beiträge: 10
Registriert: Dienstag 25. Januar 2011, 15:37

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()
Benutzeravatar
snafu
User
Beiträge: 6736
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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. :)
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

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?
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

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.
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.
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

/me: kannst du das mit 2.6.6 reproduzieren? Wäre IMHO ein Bug.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

Ist in 2.6.6 und 2.7.1 das selbe, in Python 3.1.3 passiert das nicht mehr.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Benutzeravatar
sparrow
User
Beiträge: 4183
Registriert: Freitag 17. April 2009, 10:28

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.
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten