Как же так вышло?maketrans не работает в Python 3.1?



Я новичок в Питоне.



Почему это не работает в 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, Если это возможно?

758   8  

8 ответов:

Строки - это, а не байты.

Это простое определение в Python 3.

Строки являются Юникодом (которые не являются байтами) строки Юникода используют "..." или '...'

Байты - это байты (которые не являются строками) байтовые строки используют b"..." или b'...'.

Используйте b"aeiou" для создания последовательности байтов, состоящей из кодов ASCII для определенных букв.

Вам не нужно использовать bytes.maketrans(), Когда str будет проще и устранит необходимость в префиксе 'b':

print("Swap vowels for numbers.".translate(str.maketrans('aeiou', '12345')))

Прекратите попытки изучить 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)}))

В Python 3 функция string.maketrans() устарела и заменена новыми статическими методами bytes.maketrans() и bytearray.maketrans().

Это изменение устраняет путаницу вокруг того, какие типы поддерживались модулем string.

Теперь str, bytes, и bytearray у каждого есть свои методы maketrans и translate с промежуточными таблицами перевода соответствующего типа.

"this is string example....wow!!!".translate(str.maketrans("aeiou","12345"))

Это работает, и никакого дополнительного байтового преобразования. Я не знаю причины, почему использовать byte вместо str.

Если вы абсолютно настаиваете на работе с 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!!!'
>>>

Эй, вот простой лайнер, который отлично работал для меня

import string
a = "Learning Tranlate() Methods"
print (a.translate(bytes.maketrans(b"aeiou", b"12345")))*
Вывод :::: L21rn3ng Tr1nl1t2() M2th4ds

Вот мой окончательный код Python (3.1), опубликованный здесь только для справки:

"this is string example....wow!!!".translate(bytes.maketrans(b"aeiou",b"12345"))

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

Comments

    Ничего не найдено.