Как я могу удалить символы, отличные от 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 (), чтобы оставить пробелы и точки? Я думаю, что это не слишком сложно, но я не могу понять это.

685   6  

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 d

Edit:

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' ... это то, чего ты действительно хочешь?

большее разрешение будет включать в себя:

  1. лучшее имя для функции фильтра, чем onlyascii
  2. признание того, что функция фильтра просто должна возвращать истинное значение, если аргумент должен быть сохранен:

    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

    Ничего не найдено.