用 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()