Я написал что-то, что читает файл построчно (каждая строка имеет путь к папке, например: 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
if movie_name.lower() == item.lower()
или безопаснее if movie_name.lower() in item.lower()
, а затем пользователь может поставить star
и он найдет все фильмы с Star Wars
и все с StarTrek
@Ciaran Я обновил свой текущий вывод внизу
@furas Я попробую. Спасибо
Вы можете использовать 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
Спасибо, это очень помогло. Получил это работает сейчас!
Это решает ваш вопрос?
Здесь в основном мы меняем эту часть вашего кода:
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
Это работает сейчас! Спасибо за ваше решение!! Мне очень помогает :)
Если это поможет вам, вы могли бы проголосовать за ответ, это мне очень помогает :)
Ах да, извините, я иногда забываю это сделать. Я сделал это снова и снова спасибо :)
Добро пожаловать, @SimpleJay_
Можете ли вы привести пример того, что сейчас печатается