it-swarm.com.de

Zeichen aus Datei lesen in Python

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

Wenn ich es jedoch in einen String lese, wird es "Ich habe nicht\xe2\x80\x98t wie folgt". Ich verstehe, dass\u2018 die Unicode-Darstellung von "'" ist. ich benutze

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

befehl zum Lesen.

Ist es nun möglich, die Zeichenfolge so zu lesen, dass beim Einlesen in die Zeichenfolge "Ich mag das nicht" anstelle von "Ich mag das nicht\xe2\x80\x98" lautet?

Zweite Änderung: Ich habe gesehen, dass einige Leute Mapping verwenden, um dieses Problem zu lösen, aber gibt es wirklich keine integrierte Konvertierung, die diese Art von ANSI in Unicode (und umgekehrt) konvertiert?

92
Graviton

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

Unicode aus einer Datei zu lesen 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 Aktualisierungsmodus zu öffnen und sowohl zu lesen als auch zu schreiben:

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()

[~ # ~] edit [~ # ~] : Ich gehe davon aus, dass Ihr beabsichtigtes Ziel nur darin besteht, die Datei richtig in ein lesen zu können Zeichenfolge in Python. Wenn Sie versuchen, eine ASCII Zeichenfolge aus Unicode zu konvertieren, gibt es dafür keine direkte Möglichkeit, da die Unicode-Zeichen in ASCII nicht unbedingt vorhanden sein müssen.

Wenn Sie versuchen, eine ASCII Zeichenfolge zu konvertieren, führen Sie einen der folgenden Schritte aus:

  1. Ersetzen Sie die spezifischen Unicode-Zeichen durch ASCII Äquivalente), wenn Sie nur einige Sonderfälle wie dieses Beispiel behandeln möchten

  2. Verwenden Sie die normalize() und die string.encode() Methode des unicodedata Moduls, um so gut wie möglich in das nächstgelegene ASCII äquivalent (Ref - https://web.archive.org/web/20090228203858/http://techxplorer.com/2006/07/18/converting-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'
    
143
Jay

Es gibt ein paar Punkte zu beachten.

Ein Zeichen\u00e4 kann nur als Fragment der Darstellung einer Unicode-Zeichenfolge in Python erscheinen, z. wenn du schreibst:

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

Wenn Sie den Unicode-String einfach nur hübsch ausdrucken möchten, verwenden Sie einfach die encode -Methode von Unicode:

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

Um sicherzustellen, dass jede Zeile aus einer Datei als Unicode gelesen wird, sollten Sie das codecs.open Funktion statt nur open, mit der Sie die Kodierung der Datei festlegen 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
15
DzinX

Aber es ist wirklich "Ich mag das nicht" und nicht "Ich mag das nicht". Das Zeichen u '\ u2018' ist ein völlig anderes Zeichen als "'" (und sollte optisch eher dem Zeichen "`' entsprechen).

Wenn Sie versuchen, codierten Unicode in reines ASCII zu konvertieren, können Sie möglicherweise eine Zuordnung der Unicode-Interpunktion beibehalten, die Sie in ASCII übersetzen möchten.

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

Es gibt jedoch sehr viele Interpunktionszeichen in Unicode , aber ich nehme an, Sie können sich darauf verlassen, dass nur einige von ihnen tatsächlich von einer beliebigen Anwendung verwendet werden, die die Dokumente erstellt, die Sie lesen.

6
Logan

Abgesehen von der Tatsache, dass Ihre Textdatei fehlerhaft ist (U + 2018 ist ein linkes Anführungszeichen, kein Apostroph): iconv kann verwendet werden, um Unicode-Zeichen in ASCII-Zeichen umzuwandeln.

Sie müssen für "iconvcodec" googeln, da das Modul anscheinend nicht mehr unterstützt wird und ich keine kanonische Homepage dafür finden kann.

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

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

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

Es besteht die Möglichkeit, dass Sie eine Nicht-Unicode-Zeichenfolge mit Unicode-Escapezeichen haben, z.

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

Das ist mir tatsächlich schon einmal passiert. Sie können ein unicode_escape Codec, um die Zeichenfolge in Unicode zu decodieren und anschließend in ein beliebiges Format zu codieren:

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

Tatsächlich ist U + 2018 die Unicode-Darstellung des Sonderzeichens „. Wenn Sie möchten, können Sie Instanzen dieses Zeichens mit folgendem Code in U + 0027 konvertieren:

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

Was verwenden Sie außerdem, um die Datei zu schreiben? f1.read() sollte einen String zurückgeben, der so aussieht:

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

Wenn es this string zurückgibt, wird die Datei falsch geschrieben:

'I don\u2018t like this'
1
John Millikin

Dies ist die Methode von Pythons, mit der Sie Unicode-codierte Zeichenfolgen anzeigen können. Aber ich denke, Sie sollten in der Lage sein, die Zeichenfolge ohne Probleme auf dem Bildschirm zu drucken oder in eine neue Datei zu schreiben.

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

Es ist auch möglich, eine verschlüsselte Textdatei mit der python 3 read-Methode zu lesen:

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

Bei dieser Variante müssen keine zusätzlichen Bibliotheken importiert werden

1
Stein