Frage

In einer Textdatei gibt es eine Zeichenfolge „Ich mag das nicht“.

Allerdings, wenn ich es in einen String zu lesen, wird es "I don \ XE2 \ x80 \ x98t wie diese". Ich verstehe, dass \ u2018 die Unicode-Darstellung von „'“ ist. Ich benutze

f1 = open (file1, "r")
text = f1.read()

Befehl, um das Lesen zu tun.

Nun ist es möglich, den String in einer solchen Art und Weise zu lesen, dass, wenn es in der Zeichenfolge gelesen wird, es ist „Ich mag das nicht“, statt „I don \ XE2 \ x80 \ x98t wie diese wie dieses "?

Zweite edit:? Ich habe einige Leute verwenden gesehen Mapping dieses Problem zu lösen, aber wirklich, ist es keine integrierte in Konvertierung, die diese Art von ANSI in Unicode tut (und umgekehrt) Umwandlung

War es hilfreich?

Lösung

Ref: http://docs.python.org/howto/unicode

Lesen Unicode aus einer Datei ist daher einfach:

import codecs
f = codecs.open('unicode.rst', encoding='utf-8')
for line in f:
    print repr(line)

Es ist auch möglich, Dateien im Update-Modus zu öffnen, Lesen und Schreiben erlaubt:

f = codecs.open('test', encoding='utf-8', mode='w+')
f.write(u'\u4500 blah blah blah\n')
f.seek(0)
print repr(f.readline()[:1])
f.close()

Bearbeiten : Ich gehe davon aus, dass Ihr beabsichtigtes Ziel nur in der Lage sein, die Datei korrekt in eine Zeichenfolge in Python zu lesen. Wenn Sie versuchen, in eine ASCII-Zeichenfolge aus Unicode zu konvertieren, dann gibt es wirklich keine direkte Möglichkeit, dies zu tun, da die Unicode-Zeichen werden nicht unbedingt in ASCII vorliegen.

Wenn Sie versuchen, in eine ASCII-Zeichenfolge zu konvertieren, versuchen Sie eine der folgenden Möglichkeiten:

  1. Ersetzen Sie die spezifischen Unicode-Zeichen mit ASCII-Äquivalente, wenn Sie nur ein paar Sonderfälle wie dieses Beispiel zu behandeln suchen

  2. Mit der unicodedata des normalize() Modul und die string.encode() Methode zu konvertieren, wie gut Sie können auf die nächste nächste ASCII-Äquivalent (Ref https://web.archive.org/web/20090228203858/http://techxplorer. com / 2006/07/18 / Umwandlung von Unicode-to-ascii-using-python ):

    >>> teststr
    u'I don\xe2\x80\x98t like this'
    >>> unicodedata.normalize('NFKD', teststr).encode('ascii', 'ignore')
    'I donat like this'
    

Andere Tipps

Es gibt ein paar Punkte zu beachten.

A \ u2018 Zeichen können nur als Fragment Darstellung einer Unicode-Zeichenfolge in Python erscheinen, z.B. wenn Sie schreiben:

>>> text = u'‘'
>>> print repr(text)
u'\u2018'

Nun, wenn Sie wollen einfach nur artig die Unicode-Zeichenfolge drucken, nur Unicode der encode Methode verwenden:

>>> text = u'I don\u2018t like this'
>>> print text.encode('utf-8')
I don‘t like this

Um sicherzustellen, dass jede Zeile aus einer beliebigen Datei als Unicode gelesen werden würde, würden Sie besser die codecs.open Funktion verwenden, anstatt nur open, die Sie Datei-Codierung angeben können:

>>> import codecs
>>> f1 = codecs.open(file1, "r", "utf-8")
>>> text = f1.read()
>>> print type(text)
<type 'unicode'>
>>> print text.encode('utf-8')
I don‘t like this

Aber es ist wirklich „ich don \ u2018t wie diese“ und nicht „Ich mag das nicht“. Das Zeichen u ‚\ u2018‘ ist eine ganz andere als die Zeichen „'“ (und visuell, sollte mehr entsprechen ‚`‘).

Wenn Sie versuchen, codierte Unicode in ASCII Ebene zu konvertieren, können Sie vielleicht eine Zuordnung von Unicode Interpunktion halten könnte, die Sie gerne in ASCII übersetzen.

punctuation = {
  u'\u2018': "'",
  u'\u2019': "'",
}
for src, dest in punctuation.iteritems():
  text = text.replace(src, dest)

Es gibt eine Menge von Interpunktionszeichen in Unicode aber, aber ich nehme an, Sie nur ein paar von ihnen zählen können tatsächlich verwendet werden, unabhängig von Anwendung ist die Erstellung von Dokumenten Sie lesen.

Abgesehen von der Tatsache, dass Ihre Textdatei defekt ist (U + 2018 ist ein linkses Anführungszeichen, nicht ein Apostroph). Iconv verwendet werden kann Unicode-Zeichen in ASCII zu transkribieren

Sie werden für „iconvcodec“ to google haben, da das Modul nicht mehr unterstützt zu sein scheint, und ich kann eine kanonische Homepage für ihn nicht finden.

>>> import iconvcodec
>>> from locale import setlocale, LC_ALL
>>> setlocale(LC_ALL, '')
>>> u'\u2018'.encode('ascii//translit')
"'"

Alternativ können Sie das iconv Befehlszeilenprogramm verwenden, um Ihre Datei zu bereinigen:

$ xxd foo
0000000: e280 980a                                ....
$ iconv -t 'ascii//translit' foo | xxd
0000000: 270a                                     '.

Es gibt eine Möglichkeit, dass Sie irgendwie einen Nicht-Unicode-String mit Unicode-Escape-Zeichen haben, z.

>>> print repr(text)
'I don\\u2018t like this'

Das ist mir tatsächlich passiert einmal vor. Sie können einen unicode_escape-Codec verwenden, um die Zeichenfolge zu entschlüsseln, um Unicode und kodieren sie dann in ein beliebiges Format Sie wollen:

>>> uni = text.decode('unicode_escape')
>>> print type(uni)
<type 'unicode'>
>>> print uni.encode('utf-8')
I don‘t like this

Dies ist Python Art und Weise tun, zeigen Sie kodierten Strings Unicode. Aber ich denke, sollten Sie in der Lage sein, um die Zeichenfolge auf dem Bildschirm zu drucken oder es in eine neue Datei ohne Probleme schreiben.

>>> test = u"I don\u2018t like this"
>>> test
u'I don\u2018t like this'
>>> print test
I don‘t like this

Eigentlich U + 2018 die Unicode Darstellung der Sonderzeichen ‚. Wenn Sie möchten, können Sie Instanzen dieses Zeichen U + 0027 mit diesem Code konvertieren:

text = text.replace (u"\u2018", "'")

Darüber hinaus, was Sie verwenden, die Datei zu schreiben? f1.read() sollte eine Zeichenfolge zurück, die wie folgt aussieht:

'I don\xe2\x80\x98t like this'

Wenn es Rückkehr diese string, die Datei falsch geschrieben werden:

'I don\u2018t like this'

Es ist auch möglich, eine codierte Textdatei mit den Python 3 Leseverfahren zu lesen:

f = open (file.txt, 'r', encoding='utf-8')
text = f.read()
f.close()

Bei dieser Variante gibt es keine Notwendigkeit, zusätzliche Bibliotheken zu importieren

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top