Twoje pytanie jest niejednoznaczne; pierwsze dwa zdania razem wzięte sugerują, że uważasz, że spacja i „kropka” nie są znakami ASCII. To jest niepoprawne. Wszystkie znaki takie, że ord (char) <= 127 są znakami ASCII. Na przykład twoja funkcja wyklucza te znaki! "# $% & \ '() * +, -. / Ale zawiera kilka innych, np. [] {}.
Cofnij się, pomyśl trochę i edytuj swoje pytanie, aby powiedzieć nam, co próbujesz zrobić, nie wspominając o słowie ASCII i dlaczego uważasz, że znaki takie, że 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 pojedynczy ciąg, a Twój komentarz („świetne rozwiązanie”) do innej odpowiedzi sugeruje, że nie obchodzą Cię znaki nowej linii w danych. Jeśli twój plik zawiera dwie takie linie:
this is line 1
this is line 2
wynik byłby 'this is line 1this is line 2'
... czy tego naprawdę chcesz?
Lepsze rozwiązanie obejmowałoby:
- lepsza nazwa dla funkcji filtrującej niż
onlyascii
rozpoznanie, że funkcja filtrująca musi jedynie zwrócić prawdziwą wartość, jeśli argument ma zostać zachowany:
def filter_func(char):
return char == '\n' or 32 <= ord(char) <= 126
# and later:
filtered_data = filter(filter_func, data).lower()