Я хочу проверить, есть ли какие-то слова в текстовом файле, но мне нужно сделать поиск нечувствительным к регистру, поэтому мне нужно знать, как работает «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






Вы можете использовать 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()
в файле есть «Day3» с заглавной «D», поэтому, когда я использовал только .casefold(), как вы сказали, он дал мне «нет-нет», поскольку искал «день» и «день» в файле, который только был "День",
Смешивание casefold() и lower() — это ошибка, не так ли? Он будет работать неправильно в тех немногих случаях, когда действительно имеет значение, используете ли вы тот или иной метод.
@tripleee, один casefold() должен работать в таких сценариях. Я не знаю, почему ОП получает «нет».
@ Омар, пожалуйста, убедитесь, что между ними есть пробел, например «День 3». Из вашего комментария я прочитал, что места нет. В таких случаях это возвращает «нет».
Я не говорю о конкретной проблеме, я предсказываю, что этот код не сработает в некоторых сценариях, которые могут быть или не быть у OP. См., например. stackoverflow.com/questions/45745661/…
@Остин, да, я уверен, во всяком случае, я думаю, что последний простой способ для этого - использовать .lower() для них обоих: if search_word.lower() in targetFile.read().lower()
@Austin, что касается .seek(0), мне это нужно для второй итерации, чтобы сбросить курсор
Это называется оператором «содержит», оператор проверки членства. Это действительно не идет с вариантами; он просто проверяет, присутствует ли что-то в чем-то другом, но вы можете «нормализовать» эти «что-то», например. путем преобразования обоих в нижний регистр (или верхний регистр, или регистр Юникод нормализовансложенный или что-то еще, что подходит для вашего конкретного приложения) перед проверкой на включение.
Однако повторный поиск в файле крайне неэффективен. Вы хотите прочитать файл в память один раз:
# 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.
В качестве улучшения удобства использования сообщение, которое вы печатаете, вероятно, должно указывать, какое искомое слово было или не было найдено в каждой итерации.
То же, что и
operator.__contains__