Dateien öffnen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Hi, ich sitze jetzt gerade wieder vor einem Python-Skript und würde gern eine Datei für den Input und eine für den Output öffnen, kann ich das mit dem with-Statement auch in einer Zeile machen oder muss ich das irgendwie in zwei Zeilen packen. Hilfe wäre gerade super, ich habe das schon mal irgendwann gesehen, würde es mir dann gern speichern ;)

Konkret also: Kann ich die beiden Anweisungen irgendwie in eine Zeile packen, irgendwie mit and verbinden?

Code: Alles auswählen

with open(inputfile, encoding="utf-8") as f:
    with open(outputfile, "a", encoding="utf-8") as g:
Würde die Einrückung verbessern :)
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

Suchst du das Komma?

Code: Alles auswählen

with open(inputfile, encoding="utf-8") as f, open(outputfile, "a", encoding="utf-8") as g:
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Ja, super. Passt. Als ich gerade bearbeitet hatte, habe ich dann auch mal dran gedacht. Du hast Recht!
BlackJack

Die Syntax hatten sie sich für meinen Geschmack sparen können, weil man damit eigentlich in keinem Fall unter der 80-Zeichen Grenze für eine Zeile bleiben kann.

Ich sehe das eher als Wink das man nach dem man die beiden Dateien geöffnet hat, die Verarbeitung in einer Funktion verschwinden lassen sollte, und nicht noch mehrere Ebenen zusätzlich in dem inneren ``with``-Block einrücken sollte.
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

BlackJack hat geschrieben:Die Syntax hatten sie sich für meinen Geschmack sparen können, weil man damit eigentlich in keinem Fall unter der 80-Zeichen Grenze für eine Zeile bleiben kann.
Man kann es auf mehrere Zeilen aufteilen:

Code: Alles auswählen

with open(inputfile, encoding="utf-8") as f, \
     open(outputfile, "a", encoding="utf-8") as g:
http://www.florian-diesch.de
BlackJack

@diesch: Dann kann man es auch auf mehrere Zeilen aufteilen. Die \-Syntax mag ich auch nicht. :-)
Benutzeravatar
diesch
User
Beiträge: 80
Registriert: Dienstag 14. April 2009, 13:36
Wohnort: Brandenburg a.d. Havel
Kontaktdaten:

@BlackJack: Du kannst auch Klammern nehen, aber die gefallen dir vermutlich auch nicht ;-)

Ich halte es für sinnvoll, nur einen with-Ausdruck zu verwenden, weil damit direkt klar ist, dass da eigentlich nichts verschachtelt wird, sondern alle Objekte für den Block benötigt werden.
http://www.florian-diesch.de
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

diesch hat geschrieben:@BlackJack: Du kannst auch Klammern nehen, aber die gefallen dir vermutlich auch nicht ;-)
Klammern halte ich für die bessere Wahl Bei einem Backslash muss nur ein im Editor unsichtbares Leerzeichen folgen und schon funktioniert es nicht mehr.
BlackJack

@diesch: Kann ich Klammern nehmen? Wo sollte ich die bei dem Ausdruck denn setzen?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:@diesch: Kann ich Klammern nehmen? Wo sollte ich die bei dem Ausdruck denn setzen?
Beim with-Statement geht's natürlich nicht.
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

BlackJack hat geschrieben:Die Syntax hatten sie sich für meinen Geschmack sparen können, weil man damit eigentlich in keinem Fall unter der 80-Zeichen Grenze für eine Zeile bleiben kann.

Ich sehe das eher als Wink das man nach dem man die beiden Dateien geöffnet hat, die Verarbeitung in einer Funktion verschwinden lassen sollte, und nicht noch mehrere Ebenen zusätzlich in dem inneren ``with``-Block einrücken sollte.
Wobei mir die 80-Zeichen-Grenze unglaublich knapp erscheint, besonders wenn man deinem Ratschlag folgt und immer aussagekräftige, lange Bezeichner verwendet. Da muss man praktisch immer die Zeilen umbrechen.

Welche Programme brauchen denn unbedingt zwangshaft die 80-Zeichen-Grenze? Würden es nicht auch 120 oder 140 Zeichen tun?
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Hellstorm hat geschrieben:Wobei mir die 80-Zeichen-Grenze unglaublich knapp erscheint, besonders wenn man deinem Ratschlag folgt und immer aussagekräftige, lange Bezeichner verwendet. Da muss man praktisch immer die Zeilen umbrechen.
Die 80 (bzw. 79) Zeichen sind eine grundsätzliche Empfehlung aus PEP-8, kein Gesetz. Dir steht es frei längere Zeilen zu verwenden, allerdings solltest du das, insbesondere wenn du Code mit anderen austauscht, nur sehr sparsam tun.

PEP-8 sagt dazu: "Some teams strongly prefer a longer line length. For code maintained exclusively or primarily by a team that can reach agreement on this issue, it is okay to increase the nominal line length from 80 to 100 characters (effectively increasing the maximum length to 99 characters), provided that comments and docstrings are still wrapped at 72 characters."

Ich selber habe nur sehr selten das Problem, dass meine Zeilen länger als 80 Zeichen würden. Häufig ist das für mich ein Hinweis darauf, die Programmstruktur noch mal zu überdenken.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@Hellstorm, Die Einschraenkung gibt es nicht fuer Programme sondern fuer die Maschine vor dem Bildschirm.

PEP8 gibt auch die Gruende dafuer an sich zu begrenzen. Zuletzt gab es hierfuer ein Update, das auch die Zeichenzahl angefasst hat: http://hg.python.org/peps/rev/fb24c80e9afb#l1.95

Ich persoenlich wuerde die Grenze aber weniger an Zahlen festmachen, sondern sie moeglichst kurz halten, soweit es der Lesbarkeit nicht abtraeglich ist. Da koennen durchaus auch mal Zeilen mit 120 Zeichen besser als 4 Zeilen um das gleiche zu erreichen.
BlackJack

@Hellstorm: Lang kommt im meinem Ratschlag eigentlich nicht vor, nur länger als ein oder zwei Zeichen und aussagekräftig. Ein kurzer aussagekräftiger Name ist besser als ein langer aussagekräftiger Name. ;-)

Und wenn Du dann praktisch immer Zeilen umbrechen musst, dann hast Du viele, ziemlich lange Zeilen. Dann würde ich nicht einmal mit Programmen, sondern zuerst mit Menschen argumentieren. Im Textsatz hat sich über Jahrhunderte eine Grenze von ca. 60 Zeichen pro Zeile durchgesetzt, weil alles was länger ist, für Menschen schwieriger zu lesen wird, weil das zurückwandern des Blicks zum einen den Lesefluss stört und zum anderen es leichter passiert dass man in der Zeile verrutscht, wenn die Zeilen zu lang werden.

Ansonsten ist *das* Programm was standardmässig 80 Zeichen pro Zeile hat, das Terminal. Viele Texteditoren können eine senkrechte Linie bei einer vorgegebenen Spalte anzeigen, als Hinweis. Voreinstellung in der Regel 80 Zeichen.

Webforen oder Blogs: Da muss man bei Code mit langen Zeilen plötzlich horizontal scrollen. Oder noch schlimmer: Der Beitragstext wird auch auf die Breite gezogen und wird damit als Fliesstext dann wirklich schwerer lesbar. In Textdokumenten lässt sich so ein Quelltext auch schlecht einbinden. Die übliche Praxis da dann mit einem speziellen Kennzeichen die Zeilen umzubrechen ist teilweise *wirklich* schwer zu lesen.

Und zu guter letzt: Was ist am umbrechen denn schlimm? IMHO erhöht es die lesbarkeit wenn nicht alles in elend langen Zeilen steckt. Es kann auch dazu anregen über zu *lange* Namen nachzudenken. Oder ob ein Ausdruck nicht vielleicht zu komplex ist, und irgendwie aufgeteilt werden kann. Sei das nun lokale Namen für Teilausdrücke einzuführen, oder in eine Funktion oder Methode zu verschieben. Und manchmal kann man darüber Nachdenken ob ein Aufruf tatsächlich so viele Argumente braucht.
Hellstorm
User
Beiträge: 231
Registriert: Samstag 22. Juni 2013, 15:01

Naja ich sehe vor allem bei Python das Problem, dass man ja immer mit 4 Leerzeichen einrückt. Wenn man dann in einer Funktion einer Klasse in irgendeiner if-Abfrage einer Schleife steckt und dort dann einen String in eine Funktion mit einigen Parametern schreiben möchte, kann es bei 80 Zeichen imho doch schon echt arg knapp werden, ohne dass es unbedingt unübersichtlich ist.
Antworten