在日常開發中經常需要檢查一個「目錄或資料夾」內部有沒有我們想要的檔案或資料夾,以下這篇文章主要給大家介紹了關於Python利用遞歸和walk()遍歷目錄檔案的相關資料。
方法一:遞迴呼叫:
[html] view plain copy #!/usr/bin/python #coding:utf8 import os def dirlist(path, allfile): filelist = os.listdir(path) for filename in filelist: filepath = os.path.join(path, filename) if os.path.isdir(filepath): dirlist(filepath, allfile) else: allfile.append(filepath) return allfile print dirlist("/home/yuan/testdir", [])
方法二:
os.walk()
此函數式穿件一個生成器物件來遍歷整棵目錄樹。
top指定目錄的頂層,而topdown是一個布林值,用來指示由上而下(預設值)還是由下而上來遍歷目錄。傳回的生成器將產生元組(dirpath,dirnames,filenames),其中dirpath是一個字串,包含通往目錄的路徑,dirnames是dirpath中所有子目錄的一個列表,而filename是dirpath中文件的一個列表,不包括目錄。 oneerror參數是接受單一參數的函數。
如果在處理期間出現任何錯誤,且將使用os.error的是咧嘴來呼叫此函數。預設行為時忽略錯誤。如果由上而下地遍歷目錄,修改dirnames將影響到遍歷過程。
[python] view plain copy #!/user/bin/python #!conding=utf8 import os g = os.walk("/home/yuan/testdir") for path,d,filelist in g: print d; for filename in filelist: print os.path.join(path, filename)
經常需要檢查一個「目錄或資料夾」內部有沒有我們想要的檔案或資料夾,就需要我們循環迭代出所有檔案和子資料夾,Python中遍歷指定目錄下所有的文件和資料夾,包含多層目錄,有兩種方法,一種是透過遞歸思想去遍歷,另一種是os模組的walk()函數下面話不多說,就來一起看看詳細的介紹:
列出目錄結構
一.遞歸方法
#coding:utf-8 import os allfile=[] def getallfile(path): allfilelist=os.listdir(path) for file in allfilelist: filepath=os.path.join(path,file) #判断是不是文件夹 if os.path.isdir(filepath): getallfile(filepath) allfile.append(filepath) return allfile if name == 'main': path="C:\Users\zs\PycharmProjects\demo" allfiles=getallfile(path) for item in allfiles: print item #结果 C:\Users\zs\PycharmProjects\demo\.idea\demo.iml C:\Users\zs\PycharmProjects\demo\.idea\encodings.xml C:\Users\zs\PycharmProjects\demo\.idea\misc.xml C:\Users\zs\PycharmProjects\demo\.idea\modules.xml C:\Users\zs\PycharmProjects\demo\.idea\workspace.xml C:\Users\zs\PycharmProjects\demo\.idea C:\Users\zs\PycharmProjects\demo\functiondemo.py C:\Users\zs\PycharmProjects\demo\index.py C:\Users\zs\PycharmProjects\demo\locale\en_US\LC_MESSAGES\django.po C:\Users\zs\PycharmProjects\demo\locale\en_US\LC_MESSAGES C:\Users\zs\PycharmProjects\demo\locale\en_US C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES\lang.mo C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES\lang.po C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES C:\Users\zs\PycharmProjects\demo\locale\zh_CN C:\Users\zs\PycharmProjects\demo\locale C:\Users\zs\PycharmProjects\demo\name.txt C:\Users\zs\PycharmProjects\demo\text.txt
借用遞歸的想法去列出所有資料夾中的內容,判斷如果是目錄就繼續呼叫本身的方法。
二.os模組的walk()函數
#os.walk(top, topdown=True, onerror=None, followlinks=False)
傳回一個3個元素的元祖,(dirpath, dirnames, filenames),
#dirpath:要列出指定目錄的路徑
dirnames:目錄下的所有資料夾
filenames:目錄下的所有檔案
參數一:top – 根目錄下的每一個資料夾(包含它自己), 產生3-元組(dirpath, dirnames, filenames)【資料夾路徑, 資料夾名字, 檔名】。
參數二:topdown –可選,為True或沒有指定, 一個目錄的的3-元組將比它的任何子資料夾的3-元組先產生(目錄自上而下)。如果topdown為 False, 一個目錄的3-元組將比它的任何子資料夾的3-元組後產生 (目錄自下而上)。
參數三:onerror – 可選,是一個函數; 它呼叫時有一個參數, 一個OSError實例。回報這錯誤後,繼續walk,或拋出exception終止walk。
參數四:followlinks – 設定為 true,則透過軟連結存取目錄。
#coding:utf-8 import os def getallfiles(path): allfile=[] for dirpath,dirnames,filenames in os.walk(path): for dir in dirnames: allfile.append(os.path.join(dirpath,dir)) for name in filenames: allfile.append(os.path.join(dirpath, name)) return allfile if name == 'main': path = "C:\Users\zs\PycharmProjects\demo" allfile=getallfiles(path) for file in allfile: print file #输出结果 C:\Users\zs\PycharmProjects\demo\.idea C:\Users\zs\PycharmProjects\demo\locale C:\Users\zs\PycharmProjects\demo\functiondemo.py C:\Users\zs\PycharmProjects\demo\index.py C:\Users\zs\PycharmProjects\demo\name.txt C:\Users\zs\PycharmProjects\demo\text.txt C:\Users\zs\PycharmProjects\demo\.idea\demo.iml C:\Users\zs\PycharmProjects\demo\.idea\encodings.xml C:\Users\zs\PycharmProjects\demo\.idea\misc.xml C:\Users\zs\PycharmProjects\demo\.idea\modules.xml C:\Users\zs\PycharmProjects\demo\.idea\workspace.xml C:\Users\zs\PycharmProjects\demo\locale\en_US C:\Users\zs\PycharmProjects\demo\locale\zh_CN C:\Users\zs\PycharmProjects\demo\locale\en_US\LC_MESSAGES C:\Users\zs\PycharmProjects\demo\locale\en_US\LC_MESSAGES\django.po C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES\lang.mo C:\Users\zs\PycharmProjects\demo\locale\zh_CN\LC_MESSAGES\lang.po
小結
#兩種方法輸入結果是一樣的。但是在輸入的順序有差異。比較感覺python的os模組的walk()方法比較簡
以上是python下遞歸遍歷目錄和檔案的方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!