410 Stimmen

Unicode (UTF-8) Lesen und Schreiben von Dateien in Python

Ich habe einige Gehirn Fehler im Verständnis Lesen und Schreiben von Text in eine Datei (Python 2.4).

# The string, which has an a-acute in it.
ss = u'Capit\xe1n'
ss8 = ss.encode('utf8')
repr(ss), repr(ss8)

("u'Capit \xe1n '", "'Capit \xc3\xa1n '")

print ss, ss8
print >> open('f1','w'), ss8

>>> file('f1').read()
'Capit\xc3\xa1n\n'

Ich gebe also ein Capit\xc3\xa1n in meinem Lieblingseditor, in der Datei f2.

Dann:

>>> open('f1').read()
'Capit\xc3\xa1n\n'
>>> open('f2').read()
'Capit\\xc3\\xa1n\n'
>>> open('f1').read().decode('utf8')
u'Capit\xe1n\n'
>>> open('f2').read().decode('utf8')
u'Capit\\xc3\\xa1n\n'

Was verstehe ich hier nicht? Offensichtlich gibt es einen wichtigen Teil der Magie (oder des gesunden Menschenverstands), den ich übersehe. Was muss man in Textdateien eingeben, damit sie richtig konvertiert werden?

Was ich hier wirklich nicht verstehe, ist, was der Sinn der UTF-8-Darstellung ist, wenn man Python nicht dazu bringen kann, sie zu erkennen, wenn sie von außen kommt. Vielleicht sollte ich einfach JSON dump die Zeichenfolge, und verwenden, dass stattdessen, da das eine asciiable Darstellung hat! Genauer gesagt, gibt es eine ASCII-Darstellung dieses Unicode-Objekts, die Python erkennt und dekodiert, wenn es aus einer Datei kommt? Wenn ja, wie bekomme ich sie?

>>> print simplejson.dumps(ss)
'"Capit\u00e1n"'
>>> print >> file('f3','w'), simplejson.dumps(ss)
>>> simplejson.load(open('f3'))
u'Capit\xe1n'

4voto

ʞɔıu Punkte 44966

En \x.. Sequenz ist etwas, das spezifisch für Python ist. Es handelt sich nicht um eine universelle Byte-Escape-Sequenz.

Wie Sie UTF-8-kodierte Nicht-ASCII-Dateien tatsächlich eingeben, hängt von Ihrem Betriebssystem und/oder Ihrem Editor ab. So gehen Sie in Windows vor . Für OS X zur Eingabe a mit einem akuten Akzent können Sie einfach auf option + E entonces A und fast alle Texteditoren in OS X unterstützen UTF-8.

3voto

hipertracker Punkte 2310

Sie können auch das Original verbessern open() Funktion, um mit Unicode-Dateien zu arbeiten, indem man sie an Ort und Stelle ersetzt, indem man die partial Funktion. Das Schöne an dieser Lösung ist, dass Sie keinen alten Code ändern müssen. Sie ist transparent.

import codecs
import functools
open = functools.partial(codecs.open, encoding='utf-8')

1voto

Alexx Roche Punkte 2877

Ich habe versucht zu analysieren iCal mit Python 2.7.9:

from icalendar import Kalender

Aber ich habe es verstanden:

 Traceback (most recent call last):
 File "ical.py", line 92, in parse
    print "{}".format(e[attr])
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 7: ordinal not in range(128)

und es wurde mit just behoben:

print "{}".format(e[attr].encode("utf-8"))

(Jetzt kann es liké á böss drucken.)

-2voto

dr0i Punkte 2212

Am einfachsten war es, die Standardkodierung des gesamten Skripts auf "UTF-8" zu ändern:

import sys
reload(sys)
sys.setdefaultencoding('utf8')

任意 open , print oder eine andere Anweisung verwendet einfach utf8 .

Funktioniert zumindest für Python 2.7.9 .

Der Dank geht an https://markhneedham.com/blog/2015/05/21/python-unicodeencodeerror-ascii-codec-cant-encode-character-uxfc-in-position-11-ordinal-not-in-range128/ (siehe am Ende).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X