2012-04-26 44 views
8

chciałbym napisać następujący kod:Python 3.x: Korzystanie string.maketrans() w celu stworzenia Unicode-znakowy transformację

import string 
frm = b'acdefhnoprstuw' 
to = 'אקדיפהנופרסתאו' 
trans_table = string.maketrans(frm, to) 
hebrew_phrase = 'fear cuts deeper than swords'.translate(trans_table) 

Powyższy kod nie działa, ponieważ parametr to do string.maketrans(frm, to) musi być sekwencją bajtów, a nie ciągiem znaków. Problem polega na tym, że sekwencje bajtów mogą zawierać tylko literalne znaki ASCII. Dlatego nie mogę dokonać transformacji, która tłumaczy angielskie struny na hebrajskie ciągi. Powodem jest, że string.maketrans() retruns obiekt bajtów.

Czy istnieje elegancki sposób korzystania z funkcji string.maketrans() i równoważnych funkcji, które współpracują z Unicode dla mojego zadania?

Odpowiedz

13

Musisz użyć metody str.maketrans(), która przyjmuje dwie wartości jako argumenty.

>>> frm = 'acdefhnoprstuw' 
>>> to = 'אקדיפהנופרסתאו' 
>>> trans_table = str.maketrans(frm, to) 
>>> hebrew_phrase = 'fear cuts deeper than swords'.translate(trans_table) 
>>> hebrew_phrase 
'פיאר קאתס דייפיר תהאנ סוורדס' 

string.maketrans nadal istniały w Pythonie 3.1, ale to tylko dlatego, że brakowało przesuwając go do bytes.maketrans() w wersji 3.0. Został on już przestarzały w wersji 3.1, a w wersji 3.2 już go nie ma.

+0

Czy "ciąg importu" jest zawsze dobrym pomysłem? – snakile

+0

@snakile: Niezbyt często, ale istnieją do tego użyteczne zastosowania: http://docs.python.org/py3k/library/string –

Powiązane problemy