Что называется в этом условии (чтобы найти его в документации по его имени)

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

Но через поиск в гугле не нашел Я попытался выполнить поиск, используя такие термины, как «условные операторы 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

То же, что и operator.__contains__

ForceBru 16.02.2019 10:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
39
2

Ответы 2

Вы можете использовать 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')

спасибо, я также буду использовать .lower(), чтобы сделать файл также строчным,,,,,,,,, если search_word.casefold() в targetFile.read().lower()

Omar 16.02.2019 10:29

в файле есть «Day3» с заглавной «D», поэтому, когда я использовал только .casefold(), как вы сказали, он дал мне «нет-нет», поскольку искал «день» и «день» в файле, который только был "День",

Omar 16.02.2019 10:33

Смешивание casefold() и lower() — это ошибка, не так ли? Он будет работать неправильно в тех немногих случаях, когда действительно имеет значение, используете ли вы тот или иной метод.

tripleee 16.02.2019 10:39

@tripleee, один casefold() должен работать в таких сценариях. Я не знаю, почему ОП получает «нет».

Austin 16.02.2019 10:41

@ Омар, пожалуйста, убедитесь, что между ними есть пробел, например «День 3». Из вашего комментария я прочитал, что места нет. В таких случаях это возвращает «нет».

Austin 16.02.2019 10:42

Я не говорю о конкретной проблеме, я предсказываю, что этот код не сработает в некоторых сценариях, которые могут быть или не быть у OP. См., например. stackoverflow.com/questions/45745661/…

tripleee 16.02.2019 10:44

@Остин, да, я уверен, во всяком случае, я думаю, что последний простой способ для этого - использовать .lower() для них обоих: if search_word.lower() in targetFile.read().lower()

Omar 16.02.2019 10:47

@Austin, что касается .seek(0), мне это нужно для второй итерации, чтобы сбросить курсор

Omar 16.02.2019 10:53

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

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

# 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.

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

Другие вопросы по теме