In Python 2 gibt es Unicode-Zeichenfolgen und Bytestrings. Wenn Sie nur Bytestrings verwenden, können Sie in eine Datei lesen / schreiben, die mit open()
ganz gut geöffnet wurde . Immerhin sind die Zeichenfolgen nur Bytes.
Das Problem tritt auf, wenn Sie beispielsweise eine Unicode-Zeichenfolge haben und Folgendes tun:
>>> example = u'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
Hier codieren Sie also offensichtlich entweder explizit Ihre Unicode-Zeichenfolge in utf-8 oder Sie verwenden codecs.open
dies, um dies transparent für Sie zu tun.
Wenn Sie immer nur Bytestrings verwenden, gibt es keine Probleme:
>>> example = 'Μου αρέσει Ελληνικά'
>>> open('sample.txt', 'w').write(example)
>>>
Dies ist komplizierter, da beim Verketten einer Unicode- und Bytestring-Zeichenfolge mit dem +
Operator eine Unicode-Zeichenfolge angezeigt wird . Leicht von diesem gebissen zu werden.
codecs.open
Mag auch keine Bytestrings mit Nicht-ASCII-Zeichen, die übergeben werden:
codecs.open('test', 'w', encoding='utf-8').write('Μου αρέσει')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.7/codecs.py", line 691, in write
return self.writer.write(data)
File "/usr/lib/python2.7/codecs.py", line 351, in write
data, consumed = self.encode(object, self.errors)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)
Der Ratschlag zu Zeichenfolgen für Eingabe / Ausgabe lautet normalerweise "so früh wie möglich in Unicode konvertieren und so spät wie möglich zurück in Bytestrings". Mit codecs.open
können Sie Letzteres sehr einfach tun.
Achten Sie nur darauf, dass Sie ihm Unicode-Zeichenfolgen und keine Bytestrings geben, die möglicherweise Nicht-ASCII-Zeichen enthalten.
codecs.open()
in 3.x veraltet ist, daopen()
einencoding
Argument gewonnen wird.