Как я могу удалить символы, отличные от ASCII, но оставить точки и пробелы с помощью Python?
Я работаю с a .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 (), чтобы оставить пробелы и точки? Я думаю, что это не слишком сложно, но я не могу понять это.
6 ответов:
вы можете отфильтровать все символы из строки, которые не могут быть напечатаны с помощью строку.для печати, например:
>>> s = "some\x00string. with\x15 funny characters" >>> import string >>> printable = set(string.printable) >>> filter(lambda x: x in printable, s) 'somestring. with funny characters'строку.печати на моей машине содержит:
0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ !"#$%&\'()*+,-./:;<=>?@[\]^_`{|}~ \t\n\r\x0b\x0c
простой способ перейти на другой кодек-это использовать encode() или decode(). В вашем случае, вы хотите преобразовать в ASCII и игнорировать все символы, которые не поддерживаются. Например, шведская буква å не является символом 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 dEdit:
Python3: str - > bytes - > 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 (декодирование и кодирование в обратном порядке порядок)
>>> "hej d\xe5".decode("ascii", errors="ignore").encode() 'hej d'
согласно @artfulrobot, это должно быть быстрее, чем фильтр и лямбда:
re.sub(r'[^\x00-\x7f]',r'', your-non-ascii-string)Смотрите больше примеров здесь http://stackoverflow.com/questions/20078816/replace-non-ascii-characters-with-a-single-space/20079244#20079244
ваш вопрос неоднозначен; первые два предложения, взятые вместе, подразумевают, что вы считаете, что пространство и "период" не являются символами ASCII. Это неверно. Все символы такие, что ord (char)
пожалуйста, отступите, подумайте немного и отредактируйте свой вопрос, чтобы рассказать нам, что вы пытаетесь сделать, не упоминая слово ASCII, и почему вы думаете что символы такие, что ord (char) >= 128 игнорируются. Также: какая версия Python? Какова кодировка ваших входных данных?
обратите внимание, что ваш код читает весь входной файл как одну строку, а ваш комментарий ("отличное решение") к другому ответу подразумевает, что вам не нужны новые строки в ваших данных. Если ваш файл содержит две строки, Вот так:
this is line 1 this is line 2результат будет
'this is line 1this is line 2'... это то, чего ты действительно хочешь?большее разрешение будет включать в себя:
- лучшее имя для функции фильтра, чем
onlyasciiпризнание того, что функция фильтра просто должна возвращать истинное значение, если аргумент должен быть сохранен:
def filter_func(char): return char == '\n' or 32 <= ord(char) <= 126 # and later: filtered_data = filter(filter_func, data).lower()
Если вы хотите печатать символы ascii, вы, вероятно, должны исправить свой код:
if ord(char) < 32 or ord(char) > 126: return ''это эквивалентно, чтобы
string.printable(ответ от @jterrace), за исключением отсутствия возвратов и вкладок ('\t','\n','\x0b','\x0c' и '\r'), но не соответствует диапазону на ваш вопрос
работа мой путь через Fluent Python (Ramalho) - настоятельно рекомендуется. Список понимание один-иш-лайнеры вдохновленные главой 2:
onlyascii = ''.join([s for s in data if ord(s) < 127]) onlymatch = ''.join([s for s in data if s in 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'])
Comments