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?

War es hilfreich?

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'>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top