Wie konvertiere ich ein Format einer Datei von Unicode in ASCII mit Python?
Frage
Ich verwende ein 3rd-Party-Tool, das eine Datei im Unicode-Format ausgibt. Aber ich ziehe es in ASCII zu sein. Das Tool keine Einstellungen müssen Sie das Dateiformat ändern.
Was ist der beste Weg, um das gesamte Datei-Format mit Python zu konvertieren?
Lösung
Sie können die Datei leicht genug, um konvertieren nur die unicode
Funktion, aber Sie werden ohne gerade ASCII-äquivalent Probleme mit Unicode-Zeichen führen.
Dieser Blog unicodedata
Modul empfiehlt, die dafür Sorge zu tragen scheint von rund Umwandeln von Zeichen ohne direkte entsprechende ASCII-Werte, zB
>>> title = u"Klüft skräms inför på fédéral électoral große"
wird in der Regel umgesetzt
Klft skrms infr p fdral lectoral groe
, das ist ziemlich falsch. Um jedoch das unicodedata
Modul verwendet wird, kann das Ergebnis sehr viel näher an den ursprünglichen Text:
>>> import unicodedata
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore')
'Kluft skrams infor pa federal electoral groe'
Andere Tipps
Ich denke, dies ist ein tieferes Problem, als Sie denken . die Datei von Unicode in ASCII ist einfach, aber einfach zu ändern, alle Unicode-Zeichen immer zu übersetzen in vernünftigen ASCII Pendants (viele Buchstaben sind in beiden Codierungen nicht verfügbar) ist eine andere.
Dieses Python Unicode Tutorial Sie eine bessere Vorstellung davon geben können, was zu Unicode-Strings geschieht, die ASCII übersetzt werden: http://www.reportlab.com/i18n/python_unicode_tutorial.html
Hier ist ein nützliches Zitat von der Website:
Python 1.6 wird auch eine "Unicode" eingebaute Funktion, kann auf die Sie Geben Sie die Codierung:
> >>> unicode('hello') u'hello'
> >>> unicode('hello', 'ascii') u'hello'
> >>> unicode('hello', 'iso-8859-1') u'hello'
> >>>
Alle drei dieser Rückkehr die gleiche Sache, da die Charaktere in ‚Hallo‘ für alle drei Codierungen sind häufig.
Lassen Sie uns jetzt etwas codieren mit einem Europäischer Akzent, das außerhalb ist ASCII. Was Sie an einer Konsole sehen können abhängig von Ihrem Betriebssystem locale; Windows lässt mich eintippen ISO-Latin-1.
> >>> a = unicode('André','latin-1')
> >>> a u'Andr\202'
Wenn Sie nicht einen spitzen Buchstaben e eingeben können, Sie können die Zeichenfolge ‚Andr \ 202‘ eingeben, das ist eindeutig.
Unicode unterstützt alle gemeinsam Operationen wie Iteration und Spaltung. Wir werden nicht über sie laufen hier.
übrigens, diese ist ein Linux-Befehl iconv
diese Art von Arbeit zu tun.
iconv -f utf8 -t ascii <input.txt >output.txt
Hier ist ein einfacher (und dumm) Code Codierung Übersetzung zu tun. Ich gehe davon aus (sollte man aber nicht), dass die Eingabedatei in UTF-16 (Windows nennt dies einfach ‚Unicode‘).
input_codec = 'UTF-16'
output_codec = 'ASCII'
unicode_file = open('filename')
unicode_data = unicode_file.read().decode(input_codec)
ascii_file = open('new filename', 'w')
ascii_file.write(unicode_data.write(unicode_data.encode(output_codec)))
Hinweis , dass dies nicht funktionieren wird, wenn es irgendwelche Zeichen in der Unicode-Datei, die nicht auch ASCII-Zeichen sind. Sie können die folgenden Aktionen nicht erkannte Zeichen verwandeln sich in s ‚?‘:
ascii_file.write(unicode_data.write(unicode_data.encode(output_codec, 'replace')))
Schauen Sie sich die Dokumentation für einfachere Auswahl . Wenn Sie etwas anspruchsvollere tun müssen, können Sie möchten Die UNICODE Hammer an das Python-Kochbuch.
Wie folgt aus:
uc = open(filename).read().decode('utf8')
ascii = uc.decode('ascii')
Beachten Sie jedoch, dass dies nicht mit einer UnicodeDecodeError
Ausnahme, wenn es irgendwelche Zeichen, die nicht in ASCII umgewandelt werden können.
EDIT: Wie Pete Karl nur darauf hingewiesen, gibt es keine Eins-zu-Eins-Abbildung von Unicode in ASCII. So einfach einige Zeichen können nicht in einer informationserhaltend umgewandelt werden. Darüber hinaus Standard-ASCII ist mehr oder weniger eine Teilmenge von UTF-8, so dass Sie nicht wirklich einmal eine Decodierung tun müssen.
Für mein Problem, ich wollte nur die Nicht-ASCII-Zeichen und nur Ausgang überspringen nur ascii Ausgabe, die unter Lösung funktionierte wirklich gut:
import unicodedata
input = open(filename).read().decode('UTF-16')
output = unicodedata.normalize('NFKD', input).encode('ASCII', 'ignore')
Es ist wichtig zu beachten, dass es kein Dateiformat ‚Unicode‘ ist. Unicode kann auf verschiedene Weise zu Bytes codiert werden. Am häufigsten UTF-8 oder UTF-16. Sie müssen wissen, welches Ihr 3rd-Party-Tool ausgibt. Sobald Sie wissen, dass zwischen verschiedenen Kodierungen Umwandlung ist ziemlich einfach:
in_file = open("myfile.txt", "rb")
out_file = open("mynewfile.txt", "wb")
in_byte_string = in_file.read()
unicode_string = bytestring.decode('UTF-16')
out_byte_string = unicode_string.encode('ASCII')
out_file.write(out_byte_string)
out_file.close()
Wie in den anderen Antworten erwähnt, sind Sie wahrscheinlich zu wollen, einen Fehlerhandler zu dem Kodierungsverfahren zu liefern. Mit ‚ersetzen‘, wie die Fehler-Handler einfach, aber wird Ihren Text mangle, wenn es Zeichen enthält, die nicht in ASCII dargestellt werden kann.
Wie andere Plakate haben festgestellt, ASCII ist eine Untergruppe von Unicode.
Wenn Sie jedoch:
- haben ein Vermächtnis app
- Sie haben keine Kontrolle über den Code für diese App
- Sie sind sicher, dass Sie Ihre Eingabe fällt in das ASCII-Subset
Dann unten das Beispiel zeigt, wie es geht:
mystring = u'bar'
type(mystring)
<type 'unicode'>
myasciistring = (mystring.encode('ASCII'))
type(myasciistring)
<type 'str'>