Seite 1 von 1

datei operationen

Verfasst: Freitag 21. April 2006, 15:18
von aldana
hi ich lese in skripten oft text (read only) aus einer datei.

Code: Alles auswählen

def getTextOfFile(fileName):
      fd=open(fileName,'r')
      text=fd.read()
      fd.close()
      return text
bietet python sowas built in an (auch, dass die datei sofort geschlossen wird)?

danke.

Re: datei operationen

Verfasst: Freitag 21. April 2006, 16:47
von Leonidas
aldana hat geschrieben:bietet python sowas built in an (auch, dass die datei sofort geschlossen wird)?
Na, wenn die letzte Referenz auf die Datei verschwindet wird die Datei automatisch geschlossen (Garbage Collection), also spätestens beim beenden.
Allerdings ist es besser, das explizit zu machen. Sagt auch der Zen of Python.

Verfasst: Freitag 21. April 2006, 17:31
von Joghurt
Was willst du denn machen? Hilft dir das?

Code: Alles auswählen

datei = open("datei","rt")
for line in datei:
  ...
datei.close()

Re: datei operationen

Verfasst: Freitag 21. April 2006, 18:07
von gerold
aldana hat geschrieben:bietet python sowas built in an (auch, dass die datei sofort geschlossen wird)?
Hi aldana!

Du meinst sicher so etwas:

Code: Alles auswählen

text = file(file_name, "rU").read()
Da der Bezug zum "file"-Objekt (=Synonym für "open") schon in der nächsten Zeile nicht mehr da ist, wird die Datei, angestoßen durch den GC, wieder geschlossen. Allerdings weiß man dabei den Zeitpunkt des Schließens nicht exakt. Das dürfte in den meisten Fällen kein Problem sein. Will man aber "sauber" programmieren, sollte man darauf verzichten und die Datei selber wieder schließen. Das gilt ganz besonders, wenn auch andere Prozesse auf die Datei zugreifen könnten. Je kürzer der Zugriff gehalten wird, desto besser. Es kommt auf jeden Fall zu Problemen, wenn man die Datei kurz darauf zum Schreiben öffnen möchte. Windows hält die Datei gesperrt, bis diese wieder geschlossen wird.

Code: Alles auswählen

f = file(file_name, "rU")
text = f.read()
f.close()
Durch das "f.close()" wird der Programmablauf erst fortgesetzt, wenn die Datei wieder geschlossen ist.

Um deine Frage zu beantworten: Es ist zwar kein Problem, sich so eine Funktion selber zu basteln, aber nein, ich kenne keine eingebaute Funktion, die den Text erst zurück gibt, wenn die Datei geschlossen wurde. Das bleibt also ein Dreizeiler oder man ist sich sicher, dass es kein Problem geben kann, wenn die Datei noch eine Sekunden offen ist. Was wahrscheinlich ziemlich oft der Fall sein wird.

mfg
Gerold
:-)

Verfasst: Freitag 21. April 2006, 18:13
von digitus
Ich begnüge mich meist mit
rawTxt = file(fname).read()
und spare mir das .close dadurch. Was spielt die Reihenfolge von Zurückgeben/Schließen für eine Rolle?

Verfasst: Freitag 21. April 2006, 18:29
von gerold
Hi!

Das ist mir erst nachher noch zu diesem Thema eingefallen.
Eine Warnung möchte ich noch loswerden.

Der Garbage Collector (GC), der unter anderem dafür verantwortlich ist, dass Speicher irgendwann auch mal wieder freigegeben wird, ist nur so schnell, so viel Zeit man ihm lässt.

Bei einem kleinen Progrämmchen, das weder eine große Datei einliest noch mit Variabelgrößen von hundert Megabyte arbeitet, wird der GC ziemlich schnell mit seiner Arbeit fertig sein. Meist ist es bei kleinen Skripten der Fall, dass der GC die Datei schon geschlossen hat, noch bevor man mit den Augen zwinkern kann.

Ist der Computer ausgelastet, arbeitet man mit vielen und großen Variablen und/oder großen und/oder vielen Dateien, verhält sich das schon wieder komplett anders. Der GC ist, glaube ich, darauf optimiert, Speicherbereinigungen nur dann durchzuführen, wenn gerade dazu Zeit ist oder wenn der Speicher knapp wird. Es ist also, meiner Meinung nach, sehrwohl möglich, dass die Datei noch einige Sekunden oder sogar länger offen gehalten wird. Und, wie ich bereits in meinem ersten Beitrag zu diesem Thema schrieb, ist der Zugriff auf die Datei erst wieder möglich, wenn die Datei vorher geschlossen wurde.

lg
Gerold
:-)

Verfasst: Freitag 21. April 2006, 19:26
von aldana
danke für die antworten!

ich denke ich bleibe bei meiner kleinen funktion und mache sie im python path überall verfügbar.

das close() ist denke ich wichtig. grundsätzlich sollte man dateien bzw. ressourcen, die man öffnet auch schließen/freigeben.
im dateifall trat das problem mit der sperrung nämlich auf.

die garbage collection ist super praktisch, sollte einem aber nicht davon abhalten "sauberen" code zu schreiben :)