2010-04-23 10 views
19

Ich versuche, Python zu lernen und kann nicht herausfinden, wie der folgenden Perl-Skript Python zu übersetzen:Wie ersetzt man Unicode-Zeichen durch ASCII-Zeichen in Python (Perl-Skript gegeben)?

#!/usr/bin/perl -w      

use open qw(:std :utf8); 

while(<>) { 
    s/\x{00E4}/ae/; 
    s/\x{00F6}/oe/; 
    s/\x{00FC}/ue/; 
    print; 
} 

Das Skript nur Unicode Umlaute auf alternativen ascii Ausgang ändert. (Also ist die komplette Ausgabe in ASCII.) Ich wäre dankbar für Hinweise. Vielen Dank!

+0

Suche SO für "Umschrift" verwandte Fragen zu finden. – hop

+0

http://StackOverflow.com/Questions/816285/where-is-pythons-best-ascii-for-this-unicode-database/816319#816319 – hop

+0

Das angegebene Perl-Skript wird nur das erste Auftreten in jeder Zeile ersetzen, aber das ist sicher ein Unfall. – tripleee

Antwort

17
  • Verwenden Sie das fileinput Modul über die Standardeingabe in Schleife oder eine Liste von Dateien,
  • dekodieren die Zeilen, die Sie aus lesen UTF-8 in Unicode-Objekte
  • dann alle Unicode-Zeichen bilden Sie mit dem translate Methode wünschen

translit.py würde wie folgt aussehen:

#!/usr/bin/env python2.6 
# -*- coding: utf-8 -*- 

import fileinput 

table = { 
      0xe4: u'ae', 
      ord(u'ö'): u'oe', 
      ord(u'ü'): u'ue', 
      ord(u'ß'): None, 
     } 

for line in fileinput.input(): 
    s = line.decode('utf8') 
    print s.translate(table), 

Und Sie es wie folgt verwenden:

$ cat utf8.txt 
sömé täßt 
sömé täßt 
sömé täßt 

$ ./translit.py utf8.txt 
soemé taet 
soemé taet 
soemé taet 
  • Update: standardmäßig Unicode

Falls Sie verwenden Python 3 Strings und Sie es nicht‘kodieren müssen wenn es Nicht-ASCII-Zeichen oder sogar nicht-lateinische Zeichen enthält. So wird die Lösung wie folgt aussehen:

line = 'Verhältnismäßigkeit, Möglichkeit' 

table = { 
     ord('ä'): 'ae', 
     ord('ö'): 'oe', 
     ord('ü'): 'ue', 
     ord('ß'): 'ss', 
     } 

line.translate(table) 

>>> 'Verhaeltnismaessigkeit, Moeglichkeit' 
+0

Und um ASCII-Ausgabe zu erhalten, sollte die letzte Zeile 's.translate (table) .encode ('ascii', 'ignore') drucken ', denke ich. – Frank

+0

streng genommen das Original .pl tut das auch nicht, aber ja, das wäre eine Lösung – hop

+5

Das Ziel scheint deutschen Text zu enthüllen, so dass es verständlich bleibt. Die Wirkung von 'ord (u'ß '): None' in dieser Code ist ** löschen ** das ß (" eszett ") Zeichen. Es sollte "ord (u'ß '): du'' sein. Upvotes ?? Akzeptierte Antwort ??? –

36

Für in ASCII konvertieren Sie vielleicht ASCII, Dammit oder this recipe versuchen, was läuft darauf hinaus:

>>> title = u"Klüft skräms inför på fédéral électoral große" 
>>> import unicodedata 
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore') 
'Kluft skrams infor pa federal electoral groe' 
+2

was überhaupt nicht das tut, was das Original .pl tut (hauptsächlich deutsche Sonderzeichen gut lesend) – hop

+3

Ja, aber es tut genau das, was ich richtig brauchte jetzt! –

+3

große -> groe?!? –

3

Ich benutze translitcodec

>>> import translitcodec 
>>> print '\xe4'.decode('latin-1') 
ä 
>>> print '\xe4'.decode('latin-1').encode('translit/long').encode('ascii') 
ae 
>>> print '\xe4'.decode('latin-1').encode('translit/short').encode('ascii') 
a 

Sie können die Dekodiersprache auf das ändern, was Sie benötigen. Möglicherweise möchten Sie eine einfache Funktion, um die Länge einer einzelnen Implementierung zu reduzieren. Statt zu schreiben manuelle reguläre Ausdrücken

def fancy2ascii(s): 
    return s.decode('latin-1').encode('translit/long').encode('ascii') 
3

Sie könnten unidecode versuchen Unicode in ASCII zu konvertieren. Es ist ein Python-Port von Text::Unidecode Perl-Modul:

#!/usr/bin/env python 
import fileinput 
import locale 
from contextlib import closing 
from unidecode import unidecode # $ pip install unidecode 

def toascii(files=None, encoding=None, bufsize=-1): 
    if encoding is None: 
     encoding = locale.getpreferredencoding(False) 
    with closing(fileinput.FileInput(files=files, bufsize=bufsize)) as file: 
     for line in file: 
      print unidecode(line.decode(encoding)), 

if __name__ == "__main__": 
    import sys 
    toascii(encoding=sys.argv.pop(1) if len(sys.argv) > 1 else None) 

Es FileInput Klasse verwendet globalen Zustand zu vermeiden.

Beispiel:

$ echo 'äöüß' | python toascii.py utf-8 
aouss 
Verwandte Themen