Я работаю с файлом .txt. Мне нужна строка текста из файла без символов, отличных от ASCII. Однако я хочу оставить пробелы и точки. В настоящее время я их тоже снимаю. Вот код:
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
Как мне изменить onlyascii (), чтобы оставить пробелы и точки? Думаю, это не так уж сложно, но я не могу понять.
Ответы:
Вы можете отфильтровать все символы из строки, которые нельзя распечатать, используя string.printable , например:
string.printable на моей машине содержит:
РЕДАКТИРОВАТЬ: на Python 3 фильтр вернет итерацию. Правильный способ вернуть строку:
источник
filter
заключается в том, что он возвращает итерацию. Если вам нужна тетива (как я сделал , потому что мне нужно было это делать , когда сжатие списка) , то сделать это:''.join(filter(lambda x: x in string.printable, s)
.re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)
. См. Эту ветку stackoverflow.com/a/20079244/658497Простой способ перейти на другой кодек - использовать encode () или decode (). В вашем случае вы хотите преобразовать в ASCII и игнорировать все символы, которые не поддерживаются. Например, шведская буква å не является символом ASCII:
Редактировать:
Python3: стр -> байты -> стр.
Python2: юникод -> стр -> юникод
Python2: str -> unicode -> str (декодировать и кодировать в обратном порядке)
источник
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc2 in position 27
s.decode('utf-8').encode('ascii', errors='ignore')
Согласно @artfulrobot, это должно быть быстрее, чем фильтр и лямбда:
См. Дополнительные примеры здесь http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-single-space/20079244#20079244
источник
Ваш вопрос неоднозначный; первые два предложения, взятые вместе, означают, что вы считаете, что пробел и «точка» не являются символами ASCII. Это неверно. Все символы, такие как ord (char) <= 127, являются символами ASCII. Например, ваша функция исключает эти символы! "# $% & \ '() * +, -. /, Но включает несколько других, например [] {}.
Пожалуйста, сделайте шаг назад, немного подумайте и отредактируйте свой вопрос, чтобы сообщить нам, что вы пытаетесь сделать, не упоминая слово ASCII, и почему вы думаете, что такие символы, как ord (char)> = 128, игнорируются. Также: какая версия Python? Какая кодировка ваших входных данных?
Обратите внимание, что ваш код считывает весь входной файл как одну строку, а ваш комментарий («отличное решение») к другому ответу подразумевает, что вам наплевать на символы новой строки в ваших данных. Если ваш файл содержит две такие строки:
результат будет
'this is line 1this is line 2'
... это то, чего вы действительно хотите?Лучшее решение будет включать:
onlyascii
признание того, что функция фильтра просто должна возвращать истинное значение, если аргумент должен быть сохранен:
источник
Вы можете использовать следующий код для удаления неанглийских букв:
Это вернет
источник
Если вам нужны печатные символы ascii, вам, вероятно, следует исправить свой код следующим образом:
это эквивалентно
string.printable
(ответ от @jterrace), за исключением отсутствия возвратов и вкладок ('\ t', '\ n', '\ x0b', '\ x0c' и '\ r'), но не соответствует диапазон по вашему вопросуисточник
Работаю на Fluent Python (Ramalho) - настоятельно рекомендую. Составьте список однострочников для понимания, вдохновленных главой 2:
источник