
Meine aktuellen Dateien.py sehen etwas so aus:
#!/usr/bin/python3 # -*- coding: utf-8 -*- import codecs
.. f=codecs.open(dateiname,'r',"utf8") ..
Ist die Zeile mit coding noch aktuell?
Wenn ich Text editiere, verwende ich utf-8
Hermann der in jeder von ihm verwendete Programmiersprache utf-8 Problem hatte oder hat.

-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1
Hermann Riemann wrote:
Meine aktuellen Dateien.py sehen etwas so aus:
#!/usr/bin/python3 # -*- coding: utf-8 -*- import codecs
.. f=codecs.open(dateiname,'r',"utf8") ..
Ist die Zeile mit coding noch aktuell?
Ja, aber die Coding Präambel hat absolut nichts mit dem 'encoding' Parameter von open() zu tun.
- -aj

On 2014-12-28 09:32, Hermann Riemann wrote: [Encoding in Quelltexten]
Meine aktuellen Dateien.py sehen etwas so aus:
#!/usr/bin/python3 # -*- coding: utf-8 -*-
# coding: utf-8
reicht übrigens auch, siehe https://www.python.org/dev/peps/pep-0263/ .
In Python 2 ist ASCII das Standard-Encoding für Quelltext-Dateien, in Python 3 ist es UTF-8.
[Encoding von Daten während der Laufzeit]
import codecs .. f=codecs.open(dateiname,'r',"utf8") ..
Ich würde die Funktion `open` aus dem `io`-Modul nehmen:
import io
fobj = io.open(dateiname, "r", encoding="utf8")
beziehungsweise
with io.open(dateiname, "r", encoding="utf8") as fobj: ...
Achtung: So geöffnete Dateien arbeiten nur mit Unicode-Strings, was ich aber normalerweise für eine gute Sache halte. Details siehe https://docs.python.org/2.7/library/io.html#io.open
`io.open` gibt es ab Python 2.6, also auch in Python 3. `io.open` ist identisch mit der eingebauten `open`-Funktion in Python 3.
Hermann der in jeder von ihm verwendete Programmiersprache utf-8 Problem hatte oder hat.
Welche Art von Problem(en)?
Viele Grüße Stefan

Hermann Riemann wrote:
Meine aktuellen Dateien.py sehen etwas so aus:
#!/usr/bin/python3 # -*- coding: utf-8 -*- import codecs
.. f=codecs.open(dateiname,'r',"utf8") ..
Ist die Zeile mit coding noch aktuell?
Die hilft höchstens dem Editor, da UTF-8 für Python 3 die Vorgabe für Quelltext ist. Statt codecs.open() empfehle ich das built-in zusammen mit einem with-Statement, das dafür sorgt, dass die Datei bei Verlassen des Blocks automatisch geschlossen wird:
#!/usr/bin/env python3 ... 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.
Wenn ich Text editiere, verwende ich utf-8
Hermann der in jeder von ihm verwendete Programmiersprache utf-8 Problem hatte oder hat.
Mit UTF-8 oder mit Unicode?

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
participants (4)
-
Andreas Jung
-
Hermann Riemann
-
Peter Otten
-
Stefan Schwarzer