Что называется "in" в этом условии (чтобы найти его в документации по его названию) - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу проверить, есть ли некоторые слова в текстовом файле, но мне нужно сделать поиск без учета регистра, поэтому мне нужно знать, как работает «in» внутри условия if, и посмотреть его документацию длятакой вариант.

Но я не смог найти его с помощью поиска в Google, я пытался искать с помощью таких терминов, как "Python с условными выражениями", но все равно не смог найти его.

#!/usr/bin/python3

search_words = ['Day 3','day 3']

with open('test-target.txt','r') as targetFile:
    for search_word in search_words:

        if search_word in targetFile.read():
            print('yes')
        else:
            print('no')

        # put the read cursor again at the begining of the file to prepare it fot next read ^o^
        targetFile.seek(0)

файл:

Day 3 Lab ......etc
bla bla bla

выход:

yes
no

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Это называется оператором "содержит", оператором проверки членства .Это действительно не идет с вариантами;он просто проверяет, присутствует ли что-то в чем-то другом - но вы можете «нормализовать» эти «что-то», например, преобразовав оба в нижний регистр (или верхний регистр, или нормализованный Unicode регистр сложенный или все, что подходит для вашего конкретного применения) перед проверкой на предмет локализации.

Повторный поиск в файле, однако, крайне неэффективен.Вы хотите прочитать файл в память один раз:

# Normalize once, before looping
search_words = set([x.lower() for x in ['Day 3','day 3']])

with open('test-target.txt','r') as targetFile:
    contents = targetFile.read()
for search_word in search_words:
    if search_word in contents.lower():
        print('yes')
    else:
        print('no')

... или, возможно, проверить строку за раз:

with open('test-target.txt','r') as targetFile:
    for line in targetFile:
        for search_word in search_words:
            if search_word in line.lower():
                print('yes')
                break # maybe?
    else:
        print('no')

Это будет более надежным, потому что вы можете обрабатывать произвольнобольшие файлы, если каждая отдельная строка помещается в память.

Обратите внимание, как цикл for может иметь ветвь else, к.

В качестве улучшения удобства использования,напечатанное сообщение должно, вероятно, указывать, какое поисковое слово было или не было найдено в каждой итерации.

0 голосов
/ 16 февраля 2019

Вы можете использовать casefold() для поиска без учета регистра.Вам не нужно использовать seek(0) в качестве указателя на файл, по умолчанию он указывает на начало файла при его открытии.Если вас беспокоит исчерпание указателя файла, прочитайте содержимое файла в переменную и используйте переменную в цикле:

with open('test-target.txt','r') as targetFile:
    file_contents = targetFile.read()
    for search_word in search_words:
        if search_word.casefold() in file_contents:
            print('yes')
        else:
            print('no')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...