2010-06-13 15 views
15

Soy un novato de Python.¿Cómo es que string.maketrans no funciona en Python 3.1?

¿Cómo es que this no funciona en 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); 

Cuando ejecuta el código anterior, me sale el siguiente lugar:

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 

¿Qué significa "debe ser bytes objetos" significa? ¿Podría alguien ayudarnos a publicar un código de trabajo para Python 3.1 si es posible?

+0

No funciona, porque string.maketrans doesn' haz lo que piensas Por eso fue desaprobado en 3.1 para bytes.maketrans. Debería usar str.maketrans en lugar de string.maketrans para cadenas y bytes.maketrans para bytes. –

+0

Para ver la diferencia usted mismo, compare la salida de 'print (str.maketrans (" aeiou "," 12345 "))' --que es '{97: 49, 101: 50, 105: 51, 111: 52 , 117: 53} '- a la salida de' print (bytes.maketrans (b "aeiou", b "12345")) '(que es una herramienta larga y fea para mostrar aquí.) – MarkHu

Respuesta

10

Las cadenas son no bytes.

Esta es una definición simple en Python 3.

cadenas son Unicode (que no están bytes) cadenas Unicode utilizan "..." o '...'

bytes son bytes (que no son cadenas) utilizan cadenas de bytes b"..." o b'...'.

Utilice b"aeiou" para crear una secuencia de bytes compuesta por los códigos ASCII para ciertas letras.

18

Deja de intentar aprender Python 3 leyendo la documentación de 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)})) 
+2

Perdóneme, pero como un novato, no tengo ni idea de que es P2 doc, y que es P3. Gracias por el código. – sivabudh

+6

Use el docs.python.org oficial: la versión está escrita en la parte superior de cada página. HTH –

+1

¿Por qué recibo este error cuando trato de ejecutar esto? 'impresión (s.translate ({ord (x): y para (x, y) en zip (intab, outtab)})) TypeError: espera un búfer de caracteres object' – Insarov

0

Si insiste absolutamente en trabajar con bytes de 8 bits:

>>> 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

Aquí está mi Python final (3.1) código publicado aquí sólo para referencia:

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

corto y dulce , quiéralo.

+1

Está utilizando una traducción de bytes en una cadena. No hay razón para eso, es confuso e innecesariamente limitante. –

31

No es necesario utilizar bytes.maketrans() cuando str sería más simple y elimina la necesidad de que el prefijo 'b':

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

Esto funciona, y ninguna transformación byte adicional. No sé la razón por la cual usar byte en lugar de str.

4

En Python 3, la función string.maketrans() está en desuso y se reemplaza por nuevos métodos estáticos, bytes.maketrans() y bytearray.maketrans().

Este cambio resuelve la confusión sobre qué tipos admite el módulo de cadena.

Ahora str, bytes, y bytearray cada uno tiene sus propias maketrans y translate métodos con tablas de traducción intermedios del tipo apropiado.

0

Eh aquí es el simple chiste que funcionaba perfectamente para mí

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