[Python-de] einheitliches Vorgehen beim Öffnen von Dateien.

Stefan Schwarzer sschwarzer at sschwarzer.net
Do Okt 18 06:00:47 EDT 2018


On 18/10/2018 09.59, Thomas Güttler wrote:
> So lange wir Python2 unterstützen soll io.open() verwendet werden.

Ich finde Peters Vorschlag mit

from io import open

sympathisch, weil man dann später bei ausschließlicher
Python-3-Unterstützung nur das Import-Statement löschen
muss, aber sonst keinen Code ändern muss.

> Wenn man nur den Inhalt braucht, dann ist diese einfache Variante zulässig (ohne with-Statement)
>
> content = io.open(my_file, 'rt').read()
>
> Auch beim Schreiben?

Ich schließe mich hier den anderen nachdrücklich an:
Die Datei sollte immer ordentlich geschlossen werden,
egal ob beim Lesen oder Schreiben. Beim Lesen wäre
das explizite Schließen vielleicht nicht ganz so
wichtig, was Datenverluste angeht. Aber ich halte es
trotzdem für guten Stil, explizit "hinter sich
aufzuräumen".

Die Verwendung eines `with`-Blocks hat auch den Vorteil,
dass der Leser danach weiß, dass dieses Dateiobjekt
nicht mehr für I/O verwendet wird. (Ich schätze,
theoretisch kann man dann immer noch auf `.name`
zugreifen, würde das aber für schlechten Stil halten.)

> Die Variable wird „f“ genannt:
>
> with io.open(my_file, 'wt') as f:
>          f.write(...)

Ich verwende meist `fobj`. Wenn man den Bezeichner
abseits vom `with`-Block sieht, ist damit klar, dass
`f` kein Dateiname ist, sondern ein Dateiobjekt.

Leider werden `f` und `file` mitunter sowohl für
Dateinamen (manchmal auch Pfade) als auch für
Dateiobjekte verwendet.

Apropos: Dateinamen bzw. -pfade benenne ich zur
Abgrenzung von Dateiobjekten mit `..._name` bzw.
`..._path`.

> So wird das meist in der Python-Doku gemacht: Bsp: Methods of File Objects

Ich glaube, mit Bezeichnern (und anderen Konventionen)
in der Python-Doku und Tutorials sollte man immer
vorsichtig sein. Da geht es ja normalerweise darum, "mal
eben" etwas zu zeigen. Das heißt aber nicht, dass man
dieselben Muster für Produktions-Code verwenden sollte.

> Der with-Block nach dem Open sollte kurz sein. Also nicht länger etwa 6 Zeilen.

Lieber ein langer `with`-Block als keine sauber
geschlossenen Dateien. ;-) Aber ja, lange Blöcke machen
den Code leicht unübersichtlich, vor allem wenn sie
verschachtelt sind. Im Zweifelsfall fände ich aber einen
längeren `with`-Block besser als den Code besonders
kompakt zu schreiben, nur um unter dem Zeilen-Limit zu
bleiben.

Viele Grüße
Stefan


Mehr Informationen über die Mailingliste python-de