[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