Почему string.maketrans не работает в Python 3.1?
Я новичок в Python.
Почему это не работает в Python 3.1?
from string import maketrans # Required to call maketrans function.
intab = "aeiou"
outtab = "12345"
trantab = maketrans(intab, outtab)
str = "this is string example....wow!!!";
print str.translate(trantab);
Когда я выполнил вышеприведенный код, вместо него получим следующее:
Traceback (most recent call last):
File "<pyshell#119>", line 1, in <module>
transtab = maketrans(intab, outtab)
File "/Library/Frameworks/Python.framework/Versions/3.1/lib/python3.1/string.py", line 60, in maketrans
raise TypeError("maketrans arguments must be bytes objects")
TypeError: maketrans arguments must be bytes objects
Что означает "должны быть объекты байтов"? Могла ли кто-нибудь помочь опубликовать рабочий код для Python 3.1, если это возможно?
Ответы
Ответ 1
Строки - это не байт.
Это простое определение в Python 3.
Строки - это Unicode (которые не являются байтами). Строки Unicode используют "..."
или '...'
Байты - это байты (которые не являются строками). Байт-строки используют b"..."
или b'...'
.
Используйте b"aeiou"
для создания последовательности байтов, состоящей из кодов ASCII для определенных букв.
Ответ 2
Вам не нужно использовать bytes.maketrans()
, когда str
будет проще и устранить необходимость префикса 'b':
print("Swap vowels for numbers.".translate(str.maketrans('aeiou', '12345')))
Ответ 3
Не пытайтесь изучить Python 3, прочитав документацию Python 2.
intab = 'aeiou'
outtab = '12345'
s = 'this is string example....wow!!!'
print(s.translate({ord(x): y for (x, y) in zip(intab, outtab)}))
Ответ 4
В Python 3 функция string.maketrans()
устарела и заменяется новыми статическими методами bytes.maketrans()
и bytearray.maketrans()
.
Это изменение решает путаницу, вокруг которой типы поддерживались строковым модулем.
Теперь str
, bytes
и bytearray
имеют свои собственные методы maketrans
и translate
с промежуточными таблицами перевода соответствующего типа.
Ответ 5
"this is string example....wow!!!".translate(str.maketrans("aeiou","12345"))
Это работает, и никаких дополнительных преобразований байтов.
Я не знаю причину использования байта вместо str.
Ответ 6
Если вы абсолютно настаиваете на работе с 8-битными байтами:
>>> intab = b"aeiou"
>>> outtab = b"12345"
>>> trantab = bytes.maketrans(intab, outtab)
>>> strg = b"this is string example....wow!!!";
>>> print(strg.translate(trantab));
b'th3s 3s str3ng 2x1mpl2....w4w!!!'
>>>
Ответ 7
Эй, вот простой лайнер, который отлично работал у меня
import string
a = "Learning Tranlate() Methods"
print (a.translate(bytes.maketrans(b"aeiou", b"12345")))*
ВЫХОД::
L21rn3ng Tr1nl1t2() M2th4ds
Ответ 8
Вот пример выполнения перевода и удаления в Python 2 или 3:
import sys
DELETE_CHARS = '[email protected]#$%^*()+=?\'\"{}[]<>!':;|\\/-,.'
if sys.version_info < (3,):
import string
def fix_string(s, old=None, new=None):
if old:
table = string.maketrans(old, new)
else:
table = None
return s.translate(table, DELETE_CHARS)
else:
def fix_string(s, old='', new=''):
table = s.maketrans(old, new, DELETE_CHARS)
return s.translate(table)
Ответ 9
Здесь мой окончательный код Python (3.1) размещен здесь только для справки:
"this is string example....wow!!!".translate(bytes.maketrans(b"aeiou",b"12345"))
Короткий и сладкий, любите его.