【问题标题】:How come string.maketrans does not work in Python 3.1?为什么 string.maketrans 在 Python 3.1 中不起作用?
【发布时间】:2011-03-03 03:25:37
【问题描述】:

我是 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 的工作代码吗?

【问题讨论】:

  • 它不起作用,因为 string.maketrans 没有按照你的想法做。这就是为什么它在 3.1 中被弃用的 bytes.maketrans。您应该使用 str.maketrans 而不是 string.maketrans 用于字符串,而 bytes.maketrans 用于字节。
  • 要自己查看差异,请将print(str.maketrans("aeiou","12345")) 的输出——即{97: 49, 101: 50, 105: 51, 111: 52, 117: 53}——与print(bytes.maketrans(b"aeiou",b"12345")) 的输出进行比较(此处显示的工具又长又丑。)

标签: python python-3.x


【解决方案1】:

maketrans 是一个字符串函数

使用以下逻辑使用 maketrans 进行翻译

print('maketrans' , '& translate')
intab = "aeiou"
outtab = "12345"
str = "Fruits are delicious and healthy!!!"
trantab = str.maketrans(intab, outtab)
print (str.translate(trantab))

【讨论】:

    【解决方案2】:

    这是一个在 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)
    

    【讨论】:

      【解决方案3】:

      嘿,这是一款非常适合我的简单衬里

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

      【讨论】:

        【解决方案4】:

        停止尝试通过阅读 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)}))
        

        【讨论】:

        • 对不起,但作为一个新手,我不知道哪个是 P2 文档,哪个是 P3。不过感谢您的代码。
        • 使用官方的docs.python.org:版本写在每一页的顶部。 HTH
        • 为什么我在尝试运行此程序时会收到此错误? print(s.translate({ord(x): y for (x, y) in zip(intab, outtab)})) TypeError: expected a character buffer object
        • 因小便态度而被否决。所以你有423k点。像 Guido 一样优雅地回答问题 - 那是 pythonic。
        【解决方案5】:

        在 Python 3 中,string.maketrans() 函数已弃用,取而代之的是新的静态方法 bytes.maketrans()bytearray.maketrans()

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

        现在strbytesbytearray 都有自己的maketranstranslate 方法以及适当类型的中间转换表。

        【讨论】:

          【解决方案6】:
          "this is string example....wow!!!".translate(str.maketrans("aeiou","12345"))
          

          这行得通,并且没有额外的字节转换。 不知道为什么要用byte代替str。

          【讨论】:

            【解决方案7】:

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

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

            【讨论】:

              【解决方案8】:

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

              【讨论】:

              • 我不坚持使用 8 位字节,但是已经很难找到支持 6 位或 4 位字节的计算机了。
              【解决方案9】:

              字符串是不是字节。

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

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

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

              使用b"aeiou" 创建一个由特定字母的ASCII 码组成的字节序列。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2020-09-02
                • 1970-01-01
                • 2021-07-01
                • 2023-03-24
                • 1970-01-01
                • 1970-01-01
                • 2017-06-17
                相关资源
                最近更新 更多