2017-05-22 5 views
1

ich mit einigen anderen alle Vorkommen einiger Zeichen ersetzen möchte und ich schrieb eine Übersetzung wie wie folgt:Python nicht in der Lage zu übersetzen

from string import punctuation, maketrans, digits 
lower = maketrans("ĞÜŞİÖÇ".encode('utf-8'), "ğüşiöç".encode('utf-8')) 

- - Codierung: UTF-8- -‘in der Anfang meines Codes. Wenn ich zu kodieren oder dekodieren versuchen, erhalte ich ‚UnicodeDecodeError‘ und wenn ich mir wie

ValueError: maketrans arguments must have same length 

erhalte einen Fehler keine Codierung machen Wenn Python diese bekommt Ich denke, sie unterschiedliche Größe des Bytes und die Länge der Sequenzen zuteilen sind nicht gleich. Ich benutze Python 2.7.

Dank all :)

Antwort

0

Die maketrans Methode (bytes.maketrans in Python 3) arbeitet auf bytes Objekte, daher die Notwendigkeit, die Saiten zu kodieren.

In Unicode haben die Zeichen jedoch keine feste Länge, die zwischen zwei und vier Bytes variieren kann. Hier sind die beiden Strings, einmal kodiert:

>>> "ĞÜŞİÖÇ".encode('utf-8') 
b'\xc4\x9e\xc3\x9c\xc5\x9e\xc4\xb0\xc3\x96\xc3\x87' 
>>> "ğüşiöç".encode('utf-8') 
b'\xc4\x9f\xc3\xbc\xc5\x9fi\xc3\xb6\xc3\xa7' 

Welche der ValueError erklärt Ihnen.

Ich glaube, dass die richtige Funktion zu rufen, anstatt bytes.maketrans, ist str.maketrans. Diese Funktion arbeitet direkt auf Strings, die nicht brauchen (und sollte nicht) codiert werden:

>>> str.maketrans("ĞÜŞİÖÇ", "ğüşiöç") 
{286: 287, 220: 252, 350: 351, 304: 105, 214: 246, 199: 231} 

Allerdings sind diese beiden Strings Unicode-Zeichen verwenden, so dass Sie Ihre Datei muss in utf-8 codiert werden. Behalten Sie daher # -- coding: UTF-8 -- am Anfang Ihrer Datei.