Python — сопоставление пользовательского ввода с элементами списка

Я написал что-то, что читает файл построчно (каждая строка имеет путь к папке, например: C:\test\test)

Он получает путь, а затем ищет путь ко всем файлам, помещает их в список, а затем спрашивает пользователя, какой фильм он хочет найти. Вот где я застрял

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

например: Пользовательские поиски - звездные войны

я хочу отобразить найденные файлы, например:

1 Star Wars III.mp4
2 Star Wars Return of the Jedi.mp4

поэтому в основном печатайте имя файла. Каков наилучший способ добиться этого?

У меня есть это до сих пор, но я застрял в этой части:

import os

def find_all():
    list_num = []
    print('\n','='*8,'Current folders saved','='*8)
    with open('movielist.txt', 'r') as file:
        data = file.read().splitlines()
        file.close()
        for i, item in enumerate(data, start=1):
            print('\n',i,item)
            list_num.append(i)

    user_choice = int(input('\nWhat location do you want to search? '))
    if user_choice == 1:
        one = data[0]
        filelist = os.listdir(one)
        movie_name = input('\nWhat movie are you looking for?: ')
        for i, item in enumerate(filelist, start=1):
            print('\n',i,item)

пока это просто печатает все файлы в этом месте.

это текущий вывод, который я получаю:

 ======== Current folders saved ========

 1 K:\Movies

 2 D:\Movies_list\Favorites

 What location do you want to search? 2

 What movie are you looking for?: star wars

 1 Hot Fuzz 2007 1080p.mkv

 2 Inglorious basterds 2008 1080p.mkv

 3 Jurassic Park 3 2001 1080p.mkv

 4 Over the Moon 2020 1080p.mkv

 5 Rogue One - A Star Wars Story 2016 1080p.mkv

 6 Shaun of the Dead 2004 1080p.mkv

 7 Star Wars III 1080p.mkv

 8 The Croods A New Age 2020 1080p.mkv

 9 Thor Ragnarok 2017 1080p.mkv

На примере звездных войн. Я бы хотел, чтобы программа отображала просто Star Wars III 1080p.mkv и Rogue One - A Star Wars Story 2016 1080p.mkv

Можете ли вы привести пример того, что сейчас печатается

Ciaran 23.12.2020 06:08
if movie_name.lower() == item.lower() или безопаснее if movie_name.lower() in item.lower(), а затем пользователь может поставить star и он найдет все фильмы с Star Wars и все с StarTrek
furas 23.12.2020 06:11

@Ciaran Я обновил свой текущий вывод внизу

SimpleJay_ 23.12.2020 06:13

@furas Я попробую. Спасибо

SimpleJay_ 23.12.2020 06:13
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
324
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать lower() или upper() на обоих

 if movie_name.lower() == item.lower(): 
     print('\n',i,item)

или лучше использовать in вместо ==

 if movie_name.lower() in item.lower(): 
     print('\n',i,item)

а затем пользователь может поставить Star, и он найдет все фильмы с Star Wars и все с StarTrek

Для перечисления выбранных фильмов нужна только новая переменная, потому что if пропустит заголовки, а затем i отобразит неправильный номер.

    movie_name = input('\nWhat movie are you looking for?: ')

    number = 0

    for i, item in enumerate(filelist, start=1):
        if movie_name.lower() in item.lower(): 
            number += 1
            print('\n',number,item)

Для более сложного поиска вы можете использовать regex или поместить имена в базу данных, например SQLite, и использовать SQL-запросы.

С regex вы можете использовать star.*jedi, чтобы получить только Star Wars Return of the Jedi

Спасибо, это очень помогло. Получил это работает сейчас!

SimpleJay_ 23.12.2020 06:23

Это решает ваш вопрос?

Здесь в основном мы меняем эту часть вашего кода:

for i, item in enumerate(filelist, start=1):
            print('\n',i,item)

Быть,

for i, item in enumerate(filelist, start=1):
    if movie_name.lower() in item.lower():
       print(item)

Вы можете заметить, что эта строка в коде отличается:

if movie_name.lower() in item.lower():
   print(item)

Здесь мы говорим о том, что movie_name, который дал пользователь, просто найдите его в тексте/item. И метод .lower(), который мы здесь используем, просто для того, чтобы не было проблем с корпусом.
Так, например, если пользователь ввел «Fuzz», в первую очередь это будет рассматриваться как «fuzz», и элементы в списке также будут в нижнем регистре, поэтому теперь начинается настоящий поиск. Он будет проходить по списку в цикле и искать строка "fuzz" в строке, например:

"fuzz" in "star wars iii.mp4" == False"fuzz" in "hot fuzz 2008 1080p.mkv" == True

Когда фрагмент кода имеет значение True, он просто печатает текущий элемент, на котором он зацикливался.


Вот полный фрагмент

import os


def find_all():
    list_num = []
    print('\n', '='*8, 'Current folders saved', '='*8)
    with open('movielist.txt', 'r') as file:
        data = file.read().splitlines()
        file.close()
        for i, item in enumerate(data, start=1):
            print('\n', i, item)
            list_num.append(i)

    user_choice = int(input('\nWhat location do you want to search? '))
    if user_choice:
        num = data[user_choice]
        filelist = os.listdir(num)
        movie_name = input('\nWhat movie are you looking for?: ')
        for i, item in enumerate(filelist, start=1):
            if movie_name.lower() in item.lower():
                print(item)


find_all()

Любые дополнительные вопросы по этому ответу приветствуются!

это решает это (частично), но вы могли бы описать это

furas 23.12.2020 06:16

Конечно, сделаю @furas

Aryan 23.12.2020 06:17

Это работает сейчас! Спасибо за ваше решение!! Мне очень помогает :)

SimpleJay_ 23.12.2020 06:28

Если это поможет вам, вы могли бы проголосовать за ответ, это мне очень помогает :)

Aryan 23.12.2020 06:29

Ах да, извините, я иногда забываю это сделать. Я сделал это снова и снова спасибо :)

SimpleJay_ 23.12.2020 06:32

Добро пожаловать, @SimpleJay_

Aryan 23.12.2020 06:38

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