2011-01-31 17 views
8

Tengo este pequeño método para eliminar los caracteres de control de una cadena. Desafortunadamente, no funciona en Python 2.6 (solo en Python 3.1). Afirma:Maketrans en Python 2.6

mpa = str.maketrans(dict.fromkeys(control_chars)) 

AttributeError: type object 'str' has no attribute 'maketrans'

def removeControlCharacters(line): 
    control_chars = (chr(i) for i in range(32)) 
    mpa = str.maketrans(dict.fromkeys(control_chars)) 
    return line.translate(mpa) 

¿Cómo puede ser reescrito?

Respuesta

8

Para este caso, no hay necesidad de maketrans, ya sea para cadenas de bytes o cadenas Unicode:

Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> delete_chars=''.join(chr(i) for i in xrange(32)) 
>>> '\x00abc\x01def\x1fg'.translate(None,delete_chars) 
'abcdefg' 

o:

Python 2.6.6 (r266:84297, Aug 24 2010, 18:46:32) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> delete_chars = dict.fromkeys(range(32)) 
>>> u'\x00abc\x01def\x1fg'.translate(delete_chars) 
u'abcdefg' 

o incluso en Python 3:

Python 3.1.3 (r313:86834, Nov 27 2010, 18:30:53) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> delete_chars = dict.fromkeys(range(32)) 
>>> '\x00abc\x01def\x1fg'.translate(delete_chars) 
'abcdefg' 

Ver help(str.translate) y help(unicode.translate) (en Python2) para más detalles.

+1

Para aquellos que pueden estar intentando algo como el segundo ejemplo ... si obtiene el error 'TypeError: expected a character buffer object', podría significar que la cadena que está tratando de traducir no es unicode. (Sin duda esto es obvio para Mark, pero no para los noobs como yo). – LarsH

14

En Python 2.6, maketrans está en the string module. Lo mismo con Python 2.7.

Por lo tanto, en lugar de str.maketrans, primero tenía import string y luego usa string.maketrans.