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

Achim Herwig python at wodca.de
Do Okt 18 06:23:23 EDT 2018


Hi,

ich würde in jedem Fall auf pathlib umsteigen (für Python 2 als Paket installierbar [1]), für neuen Code nur noch diese Funktionalität verwenden und alten Code dort umstellen wo er wieder angefasst wird.

Ganze Dateien kann man mit read_text() ode read_bytes() direkt lesen ohne sich um Dateideskriptorenlecks sorgen zu müssen, ansonsten würde ich auch unbedingt die Verwendung von with empfehlen.

VG, Achim.

[1] https://pypi.org/project/pathlib2/

> Am 18.10.2018 um 12:00 schrieb Stefan Schwarzer <sschwarzer at sschwarzer.net>:
> 
> 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
> _______________________________________________
> python-de maillist  -  python-de at python.org
> https://mail.python.org/mailman/listinfo/python-de

--  
Achim Herwig <achim.herwig at wodca.de> 
80997 München, Germany, +49 176 802 393 58



Mehr Informationen über die Mailingliste python-de