Eliminar caracteres que no sean ASCII de cualquier tipo de cadena dado en Python

>>> teststring = 'aõ' >>> type(teststring)  >>> teststring 'a\xf5' >>> print teststring aõ >>> teststring.decode("ascii", "ignore") u'a' >>> teststring.decode("ascii", "ignore").encode("ascii") 'a' 

que es lo que realmente quería que almacenara internamente mientras elimino los caracteres que no son ASCII. ¿Por qué la deencoding (“ascii entregó una cadena Unicode?

 >>> teststringUni = u'aõ' >>> type(teststringUni)  >>> print teststringUni aõ >>> teststringUni.decode("ascii" , "ignore") Traceback (most recent call last): File "", line 1, in  teststringUni.decode("ascii" , "ignore") UnicodeEncodeError: 'ascii' codec can't encode character u'\xf5' in position 1: ordinal not in range(128) >>> teststringUni.decode("utf-8" , "ignore") Traceback (most recent call last): File "", line 1, in  teststringUni.decode("utf-8" , "ignore") File "C:\Python27\lib\encodings\utf_8.py", line 16, in decode return codecs.utf_8_decode(input, errors, True) UnicodeEncodeError: 'ascii' codec can't encode character u'\xf5' in position 1: ordinal not in range(128) >>> teststringUni.encode("ascii" , "ignore") 'a' 

Que es otra vez lo que quería. No entiendo este comportamiento. ¿Puede alguien explicarme lo que está pasando aquí?

edición: pensé que esto podría entender las cosas para poder resolver mi problema de progtwig real que indico aquí: Convertir objetos Unicode con símbolos no ASCII en objetos de cadenas (en Python)

Es simple: .encode convierte los objetos Unicode en cadenas, y .decode convierte las cadenas en Unicode.

¿Por qué la deencoding (“ascii”) generó una cadena Unicode?

Porque para eso es para decodificar: decodifica cadenas de bytes como su ASCII en Unicode.

En su segundo ejemplo, está intentando “descodificar” una cadena que ya es unicode, que no tiene ningún efecto. Sin embargo, para imprimirlo en su terminal, Python debe codificarlo como su encoding predeterminada, que es ASCII, pero debido a que no ha realizado ese paso explícitamente y, por lo tanto, no ha especificado el parámetro ‘ignorar’, genera el error de que no puede codificar los caracteres no ASCII.

El truco para todo esto es recordar que la decode toma un bytring codificado y lo convierte a Unicode, y la encode hace lo contrario. Podría ser más fácil si entiende que Unicode no es una encoding .