Estoy trabajando con un archivo .txt. Quiero una cadena del texto del archivo sin caracteres que no sean ASCII. Sin embargo, quiero dejar espacios y puntos. En la actualidad, 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 puedo entenderlo.
Respuestas:
Puede filtrar todos los caracteres de la cadena que no se pueden imprimir usando string.printable , así:
string.printable en mi máquina contiene:
EDITAR: En Python 3, el filtro devolverá un iterable. La forma correcta de obtener un respaldo de cadena sería:
fuente
filter
es que devuelve un iterable. Si necesita una copia de la cadena (como lo hice porque necesitaba esto al hacer la compresión de la lista) y luego hacer esto:''.join(filter(lambda x: x in string.printable, s)
.re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)
? Ver este hilo stackoverflow.com/a/20079244/658497Una forma fácil de cambiar a un códec diferente es utilizando 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:
Editar:
Python3: str -> bytes -> str
Python2: unicode -> str -> unicode
Python2: str -> unicode -> str (decodificar y codificar en orden inverso)
fuente
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 27
s.decode('utf-8').encode('ascii', errors='ignore')
Según @artfulrobot, esto debería ser más rápido que filter y lambda:
Vea más ejemplos aquí http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-single-space/20079244#20079244
fuente
Tu pregunta es ambigua; las dos primeras oraciones juntas implican que cree que el espacio y el "punto" son caracteres no ASCII. Esto es incorrecto. Todos los caracteres tales que ord (char) <= 127 son caracteres ASCII. Por ejemplo, ¡su función excluye estos caracteres! "# $% & \ '() * +, -. / Pero incluye varios otros, por ejemplo, [] {}.
Por favor, retroceda, piense un poco y edite su pregunta para decirnos qué está tratando de hacer, sin mencionar la palabra ASCII, y por qué cree que los caracteres tales como ord (char)> = 128 son ignorables. Además: ¿qué versión de Python? ¿Cuál es la codificación de sus datos de entrada?
Tenga en cuenta que su código lee todo el archivo de entrada como una sola cadena, y su comentario ("gran solución") a otra respuesta implica que no le importan las nuevas líneas en sus datos. Si su archivo contiene dos líneas como esta:
el resultado sería
'this is line 1this is line 2'
... ¿es eso lo que realmente quieres?Una mejor solución incluiría:
onlyascii
Reconocimiento de que una función de filtro simplemente necesita devolver un valor veraz si se quiere retener el argumento:
fuente
Puede utilizar el siguiente código para eliminar letras que no estén en inglés:
Esto volverá
fuente
Si desea caracteres ascii imprimibles, probablemente debería corregir su código para:
esto es equivalente a
string.printable
(respuesta de @jterrace), excepto por la ausencia de retornos y pestañas ('\ t', '\ n', '\ x0b', '\ x0c' y '\ r') pero no corresponde a el rango de tu preguntafuente
Trabajando en Fluent Python (Ramalho) - muy recomendable. Enumere las frases sencillas de comprensión inspiradas en el Capítulo 2:
fuente