用 Python 實現文件查找


用 Python 實現文件查找(BIF實現及隊列實現)

(1)利用內置函數實現文件查找

1、功能:返回用戶輸入的文件的絕對路徑

2、設計思路:

  • (1)用戶輸入在哪個盤進行查找
  • (2)遍歷此盤文件,若為目標文件則輸出
  • (2)無此文件,則輸出錯誤

3、實驗代碼

#查找某個目錄下的目標文件
import os       #引入操作系統模塊
import sys      #用於標准輸入輸出
    
def search(path,name):

    for root, dirs, files in os.walk(path):  # path 為根目錄
        if name in dirs or name in files:
            flag = 1      #判斷是否找到文件
            root = str(root)
            dirs = str(dirs)
            return os.path.join(root, dirs)
    return -1


path = input('請輸入您要查找哪個盤中的文件(如:D:\\\)')
print('請輸入您要查找的文件名:')
name = sys.stdin.readline().rstrip()  #標准輸入,其中rstrip()函數把字符串結尾的空白和回車刪除
answer = search(path,name)
if answer == -1:
    print("查無此文件")
else:
    print(answer)

4、運行結果展示

1、無此文件

2、有此文件

(2)隊列實現文件查找

1、設計思路

定義隊列 ALLFiles 存儲所有文件

while ALLFiles 不為空
    if pop 為目錄
        then 將目錄內所有文件入隊
        elesif pop 為文件
            then if 為目標文件
                    then break
    end
輸出路徑

2、實驗代碼

#查找某個目錄下的目標文件
import os       #引入操作系統模塊
import sys      #用於標准輸入輸出
import easygui as g     #引入圖形用戶界面

def search(path1,name):
    Allfiles = []           #創建隊列
    Allfiles.append(path1)
        
    while len(Allfiles) != 0:    #當隊列中為空的時候跳出循環
        path =Allfiles.pop(0)    #從隊列中彈出首個路徑
        if os.path.isdir(path): #判斷路徑是否為目錄
            ALLFilePath =os.listdir(path)    #若是目錄,遍歷將里面所有文件入隊
            for line in ALLFilePath:
                newPath =path +"\\"+line   #形成絕對路徑
                Allfiles.append(newPath)
        else:   #如果是一個文件,判斷是否為目標文件
            target = os.path.basename(path)
            if target == name:
                return path
    return -1

path = g.enterbox(msg='請輸入文件目錄(如:D:DEV)')
name = g.enterbox(msg='請輸入您要查找的文件名:')
answer = search(path,name)
if answer == -1:
    g.msgbox("查無此文件",'查找錯誤')
else:
    g.msgbox(answer,'返回路徑')
    

    

3、運行結果

  • 有此文件


  • 無此文件


遇到問題及解決方法

  • 編譯錯誤

    解決方法:os.path.join() 的參數是 str 型, 添加代碼 root = str(root) dirs = str(dirs)
  • 縮進錯誤

    解決方法:為了看看它能輸出多少,我等待了五分鍾,它還沒有結束;結果把if name in dirs or name in files:語句重新打了一遍就可以了,應該是縮進的錯誤
  • 答案錯誤:把相同目錄下的其他文件也輸出出來了

    解決方法

    os.walk() 的 dirs 參數 才是返回目錄,將print(os.path.join(root, files))改為print(os.path.join(root, dirs))
  • 答案錯誤:輸出的路徑不是絕對路徑

    解決方法:將for root, dirs, files in os.walk('/'): # / 為根目錄 改為 for root, dirs, files in os.walk(path): # path 為根目錄

心得體會

  • 代碼雖然很短,但是完成它的過程很不容易
  • Python 中 循環和 if 分支后不用加大括號,但是需要 : ,而且縮進要十分注意
  • Python 不用定義類型並不代表變量沒有類型,使用變量前需要先賦值
  • 序列包含 列表、元組和字符串
    列表主要標志是[ ],是一個打了激素的數組,什么東西都能往里裝
    元組和字符串都是戴上了枷鎖的列表;元組標志是( ) 和 ,,其元素不可改變;字符串不能輕易修改
    三者共同點:
    1、都可以通過索引得到一個元素
    2、默認索引值從零開始
    3、可以通過分片的方式得到一個范圍內元素的集合
    4、有很多共同操作符(重復操作符、拼接操作符、成員關系操作符等)
  • Python 中有很多已經定義好的 BIF ,編寫代碼時很方便
  • 經常會把輸出 print() 打成 printf()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM