datei operationen

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.
aldana
User
Beiträge: 12
Registriert: Donnerstag 20. April 2006, 16:29

datei operationen

Beitragvon aldana » Freitag 21. April 2006, 15:18

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Re: datei operationen

Beitragvon Leonidas » Freitag 21. April 2006, 16:47

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.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
Benutzeravatar
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

Beitragvon Joghurt » Freitag 21. April 2006, 17:31

Was willst du denn machen? Hilft dir das?

Code: Alles auswählen

datei = open("datei","rt")
for line in datei:
  ...
datei.close()
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: datei operationen

Beitragvon gerold » Freitag 21. April 2006, 18:07

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
:-)
Zuletzt geändert von gerold am Freitag 21. April 2006, 18:19, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
digitus
User
Beiträge: 6
Registriert: Donnerstag 6. April 2006, 13:16

Beitragvon digitus » Freitag 21. April 2006, 18:13

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?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Freitag 21. April 2006, 18:29

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
aldana
User
Beiträge: 12
Registriert: Donnerstag 20. April 2006, 16:29

Beitragvon aldana » Freitag 21. April 2006, 19:26

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 :)

Wer ist online?

Mitglieder in diesem Forum: Bing [Bot]