¿Cómo puedo eliminar caracteres que no sean ASCII pero dejar puntos y espacios?
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.
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))
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'