Почему 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"))

Короткий и сладкий, любите его.