簡體   English   中英

python - 將用戶輸入與列表項匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM