有坑的地方: 若是代碼寫成這樣: [( os.path.abspath(x)) for x in os.listdir(startPath) ] 此代碼只能用於當前目錄下,listdir列出的都只是文件名,而後abspath(x)對着一個文件名找絕對路徑,確定不行,電腦裏同名的文件那麼多,你要找哪一個? 一樣,isfile()也不一樣用於一個文件名,因此這些函數都只是對當前目錄下的操做函數
import os,sys #編寫一個程序,能在某目錄以及其全部子目錄下查找文件名包含指定字符串的文件,並打印出相對路徑。 def searchFile(key,startPath = '.'): if not os.path.isdir(startPath): raise ValueError l= [os.path.join(startPath,x) for x in os.listdir(startPath)] #列出全部文件的絕對路徑 #listdir出來的相對路徑 不能用於 isfile abspath只能用在當前目錄 filelist=[x for x in l if os.path.isfile(x) if key in os.path.splitext(os.path.basename(x))[0]] #文件 #只查找文件名中 不包括後綴 文件路徑 if not hasattr(searchFile,'basePath'):#把函數當成類 添加屬性 searchFile.basePath=startPath #只有第一次調用纔會賦值給basePath outmap = map(lambda x:os.path.relpath(x,searchFile.basePath),filelist) #轉換成相對於初始路徑的相對路徑 outlist = list(outmap) dirlist= [x for x in l if os.path.isdir(x)] #目錄 for dir in dirlist: outlist = outlist + searchFile(key,dir) return outlist if __name__=='__main__': print(searchFile(sys.argv[1]))