On 2014-12-28 12:45, Peter Otten wrote:
with open(dateiname, encoding="utf-8") as f: ... # Datei verwenden assert f.closed # Datei wieder geschlossen
Ich lasse die Angabe des Encodings in der Regel auch bei open() weg. Wenn (!) UTF-8 auch der Vorgabe des Betriebssystems (locale.getpreferredencoding()) entspricht, führt das zu dem gleichen Ergebnis.
Ich bin recht skeptisch, was die implizite Verwendung von `locale.getpreferredencoding` angeht. Defaults sind gut, wenn sie konstant oder nach definierten einfachen Regeln ermittelt werden, aber für `getpreferredencoding` gilt das anscheinend nicht. Die Python-Dokumentation sagt zu `getpreferredencoding`: Return the encoding used for text data, according to user preferences. User preferences are expressed differently on different systems, and might not be available programmatically on some systems, so this function only returns a guess. Wenn ich in `io.open` den impliziten Default für das Encoding verwende, ist das quasi ein "Default zweiter Ordnung": der Default des Encodings für `open` ist der Default des Betriebssystems, - was zudem nach der Python-Doku "only a guess" ist. Wenn ich den Encoding-Default verwende und mich ein Anwender wegen eines unerwarteten Programm-Verhaltens darauf anspricht, könnte ich ihm nicht erklären, wie der Default zustande kommt, ohne in den Quellcode der Python-Distribution zu schauen. Die Ermittlung des Default-Encodings ist vermutlich auch noch vom Betriebssystem abhängig. Selbst wenn das Programm nur unter einem Betriebssystem läuft und bekannt ist, wie dort das Default-Encoding ermittelt wird, kann es noch Probleme geben. Da sich `getpreferredencoding` nur am Encoding der Umgebung orientiert, in der das Python-Programm läuft, ist es unzuverlässig für gemountete Dateisysteme, die von anderen Systemen mit einer anderen Locale-Default-Einstellung beschrieben beziehungsweise gelesen werden. Fazit: Ich würde, auch wenn es auf den ersten Blick unbequemer erscheint, das Encoding immer explizit angeben. Wenn ich das Encoding nicht selbst kontrollieren kann, sollte der Nutzer eine Möglichkeit haben, das Encoding selbst anzugeben beziehungsweise meinen Default (zum Beispiel UTF-8) zu überschreiben. Viele Grüße Stefan