Jak mogę usunąć znaki spoza zestawu ASCII, ale pozostawić kropki i spacje za pomocą Pythona?


Pracuję z plikiem .txt. Potrzebuję ciągu tekstu z pliku bez znaków spoza zestawu ASCII. Jednak chcę zachować spacje i kropki. Obecnie też je rozdzieram. Oto kod:
def onlyascii(char):
if ord(char) < 48 or ord(char) > 127: return ''
else: return chardef 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

Jak zmienić onlyascii (), aby zostawić spacje i kropki? Myślę, że nie jest to zbyt trudne, ale nie mogę tego rozgryźć.
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz odfiltrować wszystkie znaki z łańcucha, którego nie można wydrukować

string.printable
http://docs.python.org/library ... table, np .:
>>> 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 na moim komputerze zawiera:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ \t\n\r\x0b\x0c
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Łatwym sposobem przełączenia się na inny kodek jest użycie metody encode () lub decode (). W twoim przypadku chcesz przekonwertować na ASCII i zignorować wszelkie znaki, które nie są obsługiwane. Na przykład szwedzka litera å nie jest znakiem 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


Edytować

:
Python3: str - & > bajt - & > str
>>>"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 (dekoduj i koduj odwrotnie)
>>> "hej d\xe5".decode("ascii", errors="ignore").encode()
'hej d'
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Według @artfulrobot powinno to być szybsze niż filter i lambda:
re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)

Zobacz więcej przykładów tutaj

http://stackoverflow.com/quest ... 79244
https://coderoad.ru/20078816/
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Twoje pytanie jest niejednoznaczne; pierwsze dwa zdania razem wzięte oznaczają, że myślisz, że spacja i „kropka” nie są znakami ASCII. To nie jest prawda. Wszystkie znaki, takie jak ord (char) & < = 127, są znakami ASCII. Na przykład Twoja funkcja wyklucza te znaki! "# $% & Amp; \ '() * +, -./Ale zawiera kilka innych, takich jak [] {}.
Cofnij się o krok, pomyśl trochę i zmień swoje pytanie, aby powiedzieć nam, co próbujesz zrobić, nie wspominając o słowie ASCII i dlaczego uważasz, że znaki ord (char) & > = 128 są ignorowane. Ponadto: która wersja Pythona? Jakie jest kodowanie danych wejściowych?
Zwróć uwagę, że Twój kod odczytuje cały plik wejściowy jako jedną linię, a Twój komentarz („świetne rozwiązanie”) do drugiej odpowiedzi sugeruje, że nie przejmujesz się nowymi wierszami w danych. Jeśli twój plik zawiera dwie takie linie:
this is line 1
this is line 2

wynik to
'to jest linia 1 to jest linia 2'
... czy tego naprawdę chcesz?
Szersze rozwiązanie obejmowałoby:
  • lepsza nazwa dla funkcji filtrującej niż
    onlyascii
  • rozpoznanie, że funkcja filtrująca musi po prostu zwrócić wartość prawdy, jeśli argument ma być przechowywany:
    def filter_func(char): return char == '\n' or 32 <= ord(char) <= 126# and later:filtered_data = filter(filter_func, data).lower()
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz użyć następującego kodu, aby usunąć inne niż angielskie litery:
import re
str = "123456790 ABC#%? .(朱惠英)"
result = re.sub(r'[^\x00-\x7f]',r'', str)
print(result)

To wróci

123456790 ABC#%? .()
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Jeśli chcesz drukować znaki ascii, prawdopodobnie powinieneś poprawić swój kod, aby:
if ord(char) < 32 or ord(char) > 126: return ''

jest to równoważne z
string.printable
(odpowiedź z @jterrace), z wyjątkiem braku śladów i tabulatorów ('\ t', '\ n', '\ x0b', '\ x0c' i '\ r'), ale nie pasuje do zakresu Twojego pytania
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Przedzieram się przez Fluent Python (Ramalho) - gorąco polecam.
Lista jednopłaszczyznowych inspiracji inspirowanych rozdziałem 2:
onlyascii = ''.join([s for s in data if ord(s) < 127])
onlymatch = ''.join([s for s in data if s in
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'])

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się