[英]python - matching user input to list items
我寫了一些逐行讀取文件的東西(每行都有一個文件夾的路徑,例如: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)
到目前為止,這只是打印該位置的所有文件。
這是我得到的當前 output:
======== 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
使用星球大戰的例子。 我希望程序只顯示星球大戰 III 1080p.mkv 和流氓一號 - 星球大戰故事 2016 1080p.mkv
您可以在兩者上使用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
,只需在 text/ item
中搜索即可。 而我們這里使用的.lower()
方法只是為了確保大小寫沒有問題。
因此,例如,如果用戶首先輸入“Fuzz”,則將其視為“fuzz”,並且列表中的元素也將小寫,所以現在真正的搜索開始它將通過列表循環和搜索 go字符串中的字符串“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()
歡迎對此答案有更多疑問!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.