为什么string.maketrans在Python 3.1中不起作用?

问题描述 投票:18回答:9

我是一个Python新手。

为什么this在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的工作代码吗?

python python-3.x
9个回答
11
投票

字符串不是字节。

这是Python 3中的一个简单定义。

字符串是Unicode(不是字节)Unicode字符串使用"..."'...'

字节是字节(不是字符串)字节字符串使用b"..."b'...'

使用b"aeiou"创建由某些字母的ASCII代码组成的字节序列。


33
投票

bytes.maketrans()更简单并且不需要'b'前缀时,您不需要使用str

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

17
投票

通过阅读Python 2文档停止尝试学习Python 3。

intab = 'aeiou'
outtab = '12345'

s = 'this is string example....wow!!!'

print(s.translate({ord(x): y for (x, y) in zip(intab, outtab)}))

6
投票

在Python 3中,不推荐使用string.maketrans()函数,并将其替换为新的静态方法bytes.maketrans()bytearray.maketrans()

此更改解决了字符串模块支持哪些类型的混淆。

现在strbytesbytearray都有自己的maketranstranslate方法,并配有适当类型的中间翻译表。


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

这样做,并没有额外的字节转换。我不知道为什么要使用byte而不是str。


1
投票

如果你绝对坚持使用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!!!'
>>>

0
投票

嘿,这是一个简单的衬垫,对我来说非常适合

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

0
投票

以下是在Python 2或3中执行转换和删除的示例:

import sys


DELETE_CHARS = '!@#$%^*()+=?\'\"{}[]<>!`:;|\\/-,.'


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)

-1
投票

这是我最后发布的Python(3.1)代码,仅供参考:

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

简短而甜蜜,喜欢它。

© www.soinside.com 2019 - 2024. All rights reserved.