Je travaille avec un fichier .txt. Je veux une chaîne du texte du fichier sans caractères non ASCII. Cependant, je veux laisser des espaces et des périodes. Pour le moment, je les dépouille aussi. Voici le code:
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
Comment dois-je modifier onlyascii () pour laisser des espaces et des points? J'imagine que ce n'est pas trop compliqué mais je ne peux pas le comprendre.
Réponses:
Vous pouvez filtrer tous les caractères de la chaîne qui ne sont pas imprimables à l'aide de string.printable , comme ceci:
string.printable sur ma machine contient:
EDIT: Sur Python 3, le filtre retournera un itérable. La manière correcte de récupérer une chaîne serait:
la source
filter
est qu'il renvoie un itérable. Si vous avez besoin d' un retour de chaîne (comme je l'ai fait parce que je avais besoin quand faire la compression de la liste) , puis procédez comme suit:''.join(filter(lambda x: x in string.printable, s)
.re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)
. Voir ce fil stackoverflow.com/a/20079244/658497Un moyen simple de passer à un codec différent consiste à utiliser encode () ou decode (). Dans votre cas, vous souhaitez convertir en ASCII et ignorer tous les symboles qui ne sont pas pris en charge. Par exemple, la lettre suédoise å n'est pas un caractère ASCII:
Éditer:
Python3: str -> octets -> str
Python2: unicode -> str -> unicode
Python2: str -> unicode -> str (décoder et encoder dans l'ordre inverse)
la source
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 27
s.decode('utf-8').encode('ascii', errors='ignore')
Selon @artfulrobot, cela devrait être plus rapide que filter et lambda:
Voir plus d'exemples ici http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-single-space/20079244#20079244
la source
Votre question est ambiguë; les deux premières phrases prises ensemble impliquent que vous pensez que l'espace et le "point" sont des caractères non ASCII. Ceci est une erreur. Tous les caractères tels que ord (char) <= 127 sont des caractères ASCII. Par exemple, votre fonction exclut ces caractères! "# $% & \ '() * +, -. / Mais en inclut plusieurs autres, par exemple [] {}.
Veuillez prendre du recul, réfléchir un peu et modifier votre question pour nous dire ce que vous essayez de faire, sans mentionner le mot ASCII, et pourquoi vous pensez que les caractères tels que ord (char)> = 128 sont ignorables. Aussi: quelle version de Python? Quel est le codage de vos données d'entrée?
Veuillez noter que votre code lit le fichier d'entrée entier comme une seule chaîne, et votre commentaire ("excellente solution") à une autre réponse implique que vous ne vous souciez pas des nouvelles lignes dans vos données. Si votre fichier contient deux lignes comme ceci:
le résultat serait
'this is line 1this is line 2'
... est-ce ce que vous voulez vraiment?Une meilleure solution comprendrait:
onlyascii
reconnaissance qu'une fonction de filtre doit simplement renvoyer une valeur de vérité si l'argument doit être conservé:
la source
Vous pouvez utiliser le code suivant pour supprimer les lettres non anglaises:
Cela reviendra
la source
Si vous voulez des caractères ascii imprimables, vous devriez probablement corriger votre code pour:
ceci équivaut à
string.printable
(réponse de @jterrace), sauf pour l'absence de retours et de tabulations ('\ t', '\ n', '\ x0b', '\ x0c' et '\ r') mais ne correspond pas à la gamme sur votre questionla source
Travailler mon chemin à travers Fluent Python (Ramalho) - hautement recommandé. List Compréhension One-ish-Liners inspirés du Chapitre 2:
la source