Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

open file

0 views
Skip to first unread message

Matthias Huening

unread,
Sep 21, 2009, 3:16:27 AM9/21/09
to
Hallo,

gibt es eigentlich einen prinzipiellen Unterschied zwischen:

(a)
for zeile in open(datei):
tu_was()

und:

(b)
with open(datei) as f:
for zeile in f:
tu_was()


Ist eine der beiden Mᅵglichkeiten schneller, besser, schᅵner?
Wenn ja, warum?

Schᅵne Grᅵᅵe, Matthias

Thomas Rachel

unread,
Sep 21, 2009, 3:52:15 AM9/21/09
to
Matthias Huening schrieb:

> Hallo,
>
> gibt es eigentlich einen prinzipiellen Unterschied zwischen:
>
> (a)
> for zeile in open(datei):
> tu_was()
>
> und:
>
> (b)
> with open(datei) as f:
> for zeile in f:
> tu_was()
>
>
> Ist eine der beiden Möglichkeiten schneller, besser, schöner?
> Wenn ja, warum?

b) ist schöner. Denn der Kontextmanager von file(), bestehend aus den
Methoden __enter__() (die wohl nur aus dem Äquivalent von return self
besteht) und __exit__() sorgt in letzterer dafür, daß das Objekt
geschlossen wird.

Bei a) wird das Objekt zwar auch (meistens) geschlossen, wenn das
Dateiobjekt "fallengelassen" wird, aber das geht dann über __del__, und
für deren Aufruf gibt es unter gewissen Umständen keine Garantie (bzw.
es ist sogar spezifiziert, daß sie nicht aufgerufen wird):

http://docs.python.org/reference/datamodel.html#object.__del__


Thomas

Peter Otten

unread,
Sep 21, 2009, 4:09:14 AM9/21/09
to
Matthias Huening wrote:

> Hallo,
>
> gibt es eigentlich einen prinzipiellen Unterschied zwischen:
>
> (a)
> for zeile in open(datei):
> tu_was()

Hier wird die Datei erst geschlossen, wenn die Garbage-Collection das file-
Objekt freigibt. Das geschieht bei CPython sofort nach der for-Schleife;
andere Implementierungen wie Jython und IronPython können sich dabei mehr
Zeit lassen.



> und:
>
> (b)
> with open(datei) as f:
> for zeile in f:
> tu_was()

Hier garantiert die Spezifikation, dass die Datei bei Verlassen der with-
Suite geschlossen wird. (b) ersetzt das alte etwas umständliche

(c)
f = open(...)
try:
...
finally:
f.close()



> Ist eine der beiden Möglichkeiten schneller, besser, schöner?
> Wenn ja, warum?

In der Praxis ist der Unterschied oft zu vernachlässigen; die 'with'-
Variante ist aber die konzeptionell sauberere Lösung. Da sie kaum
Mehraufwand erfordert, wird sie sich wohl jenseits von kurzlebigen Skripten
stärker durchsetzen als (c).

Peter

Matthias Huening

unread,
Sep 21, 2009, 4:22:33 AM9/21/09
to
Aha - interessant. Es geht also um das Schließen der Datei.
Danke, Thomas und Peter für die schnelle Antwort.

Schöne Grüße, Matthias

0 new messages