Stefan Schwarzer schrieb:
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/ .
Und da steht etwas von Abhängigkeit vom Editor. Da ich aber mehrere Editoren verwende (meist emacs, manchmal vi, xemacs und vielleicht auch mal andere) mag ich mich da nicht festlegen.
In Python 2 ist ASCII das Standard-Encoding für Quelltext-Dateien, in Python 3 ist es UTF-8.
In strings gingen vielleicht auch ISO-Zeichen (>127).
[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") fobj =codecs.open(dateiname, "r", "utf8") ist kürzer
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.
Die Datei mit dem Inhalt: import locale print(locale.getpreferredencoding()) liefert nach Aufruf mit Phyton3 UTF-8 Wenn also The default encoding is platform dependent (whatever locale.getpreferredencoding() returns) gilt müsste encoding default UTF-8 sein und nicht None wie bei der gelb markierten Parameterliste Wenn ich dem codecs Hinweis nachgehe lese ich in https://docs.python.org/2.7/library/codecs.html#module-codecs etwas von codecs.BOM_UTF8
`io.open` ist identisch mit der eingebauten `open`-Funktion in Python 3.
D.h. ich könnte normale open ohne Parameter für encoding für utf8-Dateien in Python>=3 benutzen. Mit open ging mal bei utf-8 etwas schief, was mich zur Suche nach Alternativen veranlasste. Zu einigen Parameter habe ich noch fragen. ( Früher habe ich Dateien meist mit C bearbeitet.) buffering: Wird bei buffering=0 der Wert sofort herausgeschrieben, so dass bei Programmabbruch man das bis dahin geschriebene lesen kann? Als Ersatz für flush() newline: Das Programm f=open('x','w') f.write("bla\nbla") f.close() f=open('x') for line in f:print(len(line)) liefert: 4 3 passt vielleicht nicht zur Beschreibung
Hermann der in jeder von ihm verwendete Programmiersprache utf-8 Problem hatte oder hat.
Welche Art von Problem(en)?
Z.B. QT4 utf im Menutext aus unterschiedlichen Quellen In Python mit diakritischen Zeichen (Im mit Python programmiertem Editor eine Stelle im Fenster für mehrere "Buchstaben" im string) oder im anderen Fall bei gewissen Werten erhalte ich beim Schreiben: UnicodeEncodeError -- http://www.Hermann-Riemann.de
On 2014-12-30 12:05, Hermann Riemann wrote:
Stefan Schwarzer schrieb:
On 2014-12-28 09:32, Hermann Riemann wrote: # coding: utf-8
reicht übrigens auch, siehe https://www.python.org/dev/peps/pep-0263/ .
Und da steht etwas von Abhängigkeit vom Editor. Da ich aber mehrere Editoren verwende (meist emacs, manchmal vi, xemacs und vielleicht auch mal andere) mag ich mich da nicht festlegen.
Wie geht "nicht festlegen"? Verwendest du in jeder Datei ein anderes Format? ;-) Ok, das war jetzt spitzfindig. :-)
In Python 2 ist ASCII das Standard-Encoding für Quelltext-Dateien, in Python 3 ist es UTF-8.
In strings gingen vielleicht auch ISO-Zeichen (>127).
Ich denke nicht. Vielleicht missverstehen wir uns hier. Kannst du bitte genauer beschreiben, was du meinst?
[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") fobj =codecs.open(dateiname, "r", "utf8") ist kürzer
Ja, aber ich denke, das ist nicht das einzige Argument, das für eine der beiden Varianten spricht. Ich denke, dass `io.open` in modernem Python die idiomatischere Variante ist.
Die Datei mit dem Inhalt: import locale print(locale.getpreferredencoding()) liefert nach Aufruf mit Phyton3 UTF-8
Das Problem ist, dass der Aufruf von `getpreferredencoding` auf verschiedenen Betriebssystemen unterschiedliche Werte liefern kann. Außerdem garantiert dieser Default-Wert nicht, dass die Dateien, die du lesen willst, tatsächlich dieses Encoding haben.
Wenn also The default encoding is platform dependent (whatever locale.getpreferredencoding() returns) gilt müsste encoding default UTF-8 sein und nicht None wie bei der gelb markierten Parameterliste
Technisch ist der Default in der Argument-Liste `None`, aber innerhalb von `open` wird der Rückgabewert von `getpreferredencoding` verwendet, wenn das `encoding`-Argument `None` ist. Daher sagt man in dem Zusammenhang (etwas unpräzise), dass der Default-Wert der Rückgabewert von `getpreferredencoding` ist.
`io.open` ist identisch mit der eingebauten `open`-Funktion in Python 3.
D.h. ich könnte normale open ohne Parameter für encoding für utf8-Dateien in Python>=3 benutzen.
Du könntest, aber ich rate davon ab. :-) Ich hatte in meiner vorherigen Mail ja einiges dazu geschrieben.
Mit open ging mal bei utf-8 etwas schief, was mich zur Suche nach Alternativen veranlasste.
Mir scheint, es gibt da noch ein paar Missverständnisse zu Encodings und Byte-/Unicode-Strings. Falls du das noch nicht getan hast, empfehle ich dir, https://docs.python.org/3/howto/unicode.html zu lesen.
Zu einigen Parameter habe ich noch fragen. ( Früher habe ich Dateien meist mit C bearbeitet.)
buffering: Wird bei buffering=0 der Wert sofort herausgeschrieben,
Laut https://docs.python.org/3/library/functions.html#open ist `buffering` == 0 nur für im Binärmodus geöffnete Dateien zulässig.
so dass bei Programmabbruch man das bis dahin geschriebene lesen kann? Als Ersatz für flush()
Theoretisch ja, aber ich würde mich nicht (hundertprozentig) darauf verlassen. Das gilt für `flush` aber auch. Das Problem ist, dass es Pufferung auf verschiedenen Verarbeitungsebenen gibt und dass alle diese Ebenen die `flush`-Semantik unterstützen müssen, also die gepufferten Daten an die jeweilige Ebene "darunter" weiterreichen müssen.
newline: Das Programm f=open('x','w') f.write("bla\nbla") f.close() f=open('x') for line in f:print(len(line)) liefert: 4 3 passt vielleicht nicht zur Beschreibung
Ich verstehe nicht, was du meinst. Auf welche "Beschreibung" beziehst du dich hier?
Hermann der in jeder von ihm verwendete Programmiersprache utf-8 Problem hatte oder hat.
Welche Art von Problem(en)?
Z.B. QT4 utf im Menutext aus unterschiedlichen Quellen
Ich kenne mich mit Qt nicht aus, aber ich könnte mir vorstellen, dass beim Lesen des oben angegebenen Unicode-Howtos ein paar Dinge klarer werden. Viele Grüße Stefan
participants (2)
-
Hermann Riemann
-
Stefan Schwarzer