2010-06-13 74 views
15

我是一個Python新手。爲什麼string.maketrans在Python 3.1中不起作用?

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的工作代碼,如果可能的話?

+0

這是不行的,因爲沒有按string.maketrans」不要做你的想法。這就是爲什麼它在3.1中爲bytes.maketrans所棄用。您應該使用str.maketrans而不是string.maketrans作爲字符串,而使用bytes.maketrans作爲字節。 – 2012-04-26 10:03:56

+0

要自己查看差異,請比較print(str.maketrans(「aeiou」,「12345」))'的輸出 - 這是 '{97:49,101:50,105:51,111:52 ,print:(bytes.maketrans(b「aeiou」,b「12345」))'(這是一個長而醜陋的工具,可以在這裏展示。) – MarkHu 2017-06-08 23:26:05

回答

10

字符串是而不是字節。

這是在Python一個簡單的定義3.

字符串都是Unicode(未字節)Unicode字符串使用"..."'...'

字節即字節(它們不是字符串)字節字符串使用b"..."b'...'

使用b"aeiou"可創建由某些字母的ASCII碼組成的字節序列。

18

停止嘗試通過閱讀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)})) 
+2

請原諒我,但作爲新手,我沒有線索,這是P2文件,哪個是P3。儘管感謝代碼。 – sivabudh 2010-06-13 04:41:37

+6

使用官方docs.python.org:該版本寫在每頁的頂部。 HTH – 2012-04-02 10:56:08

+1

爲什麼我在嘗試運行時遇到此錯誤? 'print(s.translate({ord(x):y for zip(intab,outtab)中的(x,y)})) TypeError:期望一個字符緩衝對象' – Insarov 2014-05-02 17:46:08

0

如果你絕對堅持與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!!!' 
>>> 
-1

這是我最後的Python(3.1)代碼貼在這裏僅供參考:

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

簡短而親切, 愛它。

+1

您正在字符串上使用字節轉換。沒有理由,這是混亂和不必要的限制。 – 2011-10-02 10:01:41

31

你並不需要使用bytes.maketrans()str會更簡單,消除了「B」字頭的需要:

print("Swap vowels for numbers.".translate(str.maketrans('aeiou', '12345'))) 
3
"this is string example....wow!!!".translate(str.maketrans("aeiou","12345")) 

這工作,並沒有額外的字節轉換。 我不知道爲什麼要使用字節而不是str。

4

在Python 3中,​​函數已被棄用,並被新的靜態方法bytes.maketrans()和取代。

該更改解決了字符串模塊支持哪些類型的困惑。

現在strbytesbytearray每個人都有自己maketranstranslate方法與適當類型的中間轉換表。

0

嘿這裏是簡單的一個襯墊,其完美的工作對我來說

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