einheitliches Vorgehen beim Öffnen von Dateien.

Wenn man gemeinsam Quelltext schreibt, ist es sinnvoll sich Guidelines zu erstellen. Was haltet ihr von diesen Guidelines? Ziel: einheitliches Vorgehen beim Öffnen von Dateien. So lange wir Python2 unterstützen soll io.open() verwendet werden. Es sollte immer der Mode angegeben werden: also meist eines aus dieser Liste: 'rt', 'rb', 'wt', 'wb' Wenn im Textmode geöffnet wird, braucht nicht 'utf8' angegeben werden, denn das ist der Default (locale.getpreferredencoding(False) ist bei uns immer 'utf8') 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? Die Variable wird „f“ genannt: with io.open(my_file, 'wt') as f: f.write(...) So wird das meist in der Python-Doku gemacht: Bsp: Methods of File Objects Der with-Block nach dem Open sollte kurz sein. Also nicht länger etwa 6 Zeilen. Gruß, Thomas -- Thomas Guettler http://www.thomas-guettler.de/ I am looking for feedback: https://github.com/guettli/programming-guidelines

Am Do Oktober 18 2018, 09:59:08 schrieb Thomas Güttler:
Wenn man gemeinsam Quelltext schreibt, ist es sinnvoll sich Guidelines zu erstellen.
Was haltet ihr von diesen Guidelines?
Ziel: einheitliches Vorgehen beim Öffnen von Dateien.
So lange wir Python2 unterstützen soll io.open() verwendet werden.
Vielleicht mit from io import open das Built-in überschreiben? Ich bin allerdings auf Python 3 fixiert...
Es sollte immer der Mode angegeben werden: also meist eines aus dieser Liste: 'rt', 'rb', 'wt', 'wb'
Ich verwende immer nix, "w", "rb" oder "wb"; mit diesen Richtlinien könntest du mich quälen ;)
Wenn im Textmode geöffnet wird, braucht nicht 'utf8' angegeben werden, denn das ist der Default (locale.getpreferredencoding(False) ist bei uns immer 'utf8')
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?
Niemals ohne with. Wenn du häufig eine komplette Datei einliest: def read_text(filename): with open(filename) as f: return f.read()
Die Variable wird „f“ genannt:
with io.open(my_file, 'wt') as f: f.write(...)
So wird das meist in der Python-Doku gemacht: Bsp: Methods of File Objects
Mache ich auch oft, damit wird pylint aber nicht glücklich. Bei zwei Dateien nutze ich meist instream und outstream.
Der with-Block nach dem Open sollte kurz sein. Also nicht länger etwa 6 Zeilen.
*Jeder* Block sollte kurz sein. Ist aber nicht immer durchzuhalten.

io.open(...).read() oder io.open(...).write() sind nicht empfehlenswert, denn bei PyPy oder Jython oder wenn CPython den gc ändert, werden Dateien nicht mehr sofort geschlossen. Das kann dazu führen, dass dem Betriebsystem die Datei-Handles ausgehen, und das Programm nicht mehr funktioniert oder sogar abstürzt. Bei write kann es auch passieren, das dadurch die Dateiinhalte nur im Buffer sind. Und man kann nie wissen, wie man das System einstellt oder ersetzt, daher würde ich auch empfehlen, das encoding immer anzugeben. Thomas Güttler <guettliml@thomas-guettler.de> schrieb am Do., 18. Okt. 2018, 10:08:
Wenn man gemeinsam Quelltext schreibt, ist es sinnvoll sich Guidelines zu erstellen.
Was haltet ihr von diesen Guidelines?
Ziel: einheitliches Vorgehen beim Öffnen von Dateien.
So lange wir Python2 unterstützen soll io.open() verwendet werden.
Es sollte immer der Mode angegeben werden: also meist eines aus dieser Liste: 'rt', 'rb', 'wt', 'wb'
Wenn im Textmode geöffnet wird, braucht nicht 'utf8' angegeben werden, denn das ist der Default (locale.getpreferredencoding(False) ist bei uns immer 'utf8')
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?
Die Variable wird „f“ genannt:
with io.open(my_file, 'wt') as f: f.write(...)
So wird das meist in der Python-Doku gemacht: Bsp: Methods of File Objects
Der with-Block nach dem Open sollte kurz sein. Also nicht länger etwa 6 Zeilen.
Gruß, Thomas
-- Thomas Guettler http://www.thomas-guettler.de/ I am looking for feedback: https://github.com/guettli/programming-guidelines _______________________________________________ python-de maillist - python-de@python.org https://mail.python.org/mailman/listinfo/python-de

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

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@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@python.org https://mail.python.org/mailman/listinfo/python-de
-- Achim Herwig <achim.herwig@wodca.de> 80997 München, Germany, +49 176 802 393 58
participants (5)
-
Achim Herwig
-
Kaeptm Blaubaer
-
Peter Otten
-
Stefan Schwarzer
-
Thomas Güttler