¿Cómo puedo eliminar caracteres que no sean ASCII pero dejar puntos y espacios?

Resuelto asked hace 12 años • 8 respuestas

Estoy trabajando con un archivo .txt. Quiero una cadena de texto del archivo sin caracteres que no sean ASCII. Sin embargo, quiero dejar espacios y puntos. Actualmente, también los estoy quitando. Aquí está el código:

def onlyascii(char):
    if ord(char) < 48 or ord(char) > 127: return ''
    else: return char

def get_my_string(file_path):
    f=open(file_path,'r')
    data=f.read()
    f.close()
    filtered_data=filter(onlyascii, data)
    filtered_data = filtered_data.lower()
    return filtered_data

¿Cómo debo modificar onlyascii() para dejar espacios y puntos? Imagino que no es demasiado complicado pero no logro entenderlo.

 avatar Jan 01 '12 01:01
Aceptado

Puede filtrar todos los caracteres de la cadena que no se pueden imprimir usando string.printable , así:

>>> s = "some\x00string. with\x15 funny characters"
>>> import string
>>> printable = set(string.printable)
>>> filter(lambda x: x in printable, s)
'somestring. with funny characters'

string.printable en mi máquina contiene:

0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c

EDITAR: en Python 3, el filtro devolverá un iterable. La forma correcta de recuperar una cadena sería:

''.join(filter(lambda x: x in printable, s))
jterrace avatar Dec 31 '2011 18:12 jterrace

Una forma sencilla de cambiar a un códec diferente es utilizar encode() o decode(). En su caso, desea convertir a ASCII e ignorar todos los símbolos que no son compatibles. Por ejemplo, la letra sueca å no es un carácter ASCII:

    >>>s = u'Good bye in Swedish is Hej d\xe5'
    >>>s = s.encode('ascii',errors='ignore')
    >>>print s
    Good bye in Swedish is Hej d

Editar:

Python3: cadena -> bytes -> cadena

>>>"Hej då".encode("ascii", errors="ignore").decode()
'hej d'

Python2: Unicode -> str -> Unicode

>>> u"hej då".encode("ascii", errors="ignore").decode()
u'hej d'

Python2: str -> unicode -> str (decodifica y codifica en orden inverso)

>>> "hej d\xe5".decode("ascii", errors="ignore").encode()
'hej d'
Zweedeend avatar Aug 25 '2013 15:08 Zweedeend