Python學習筆記之遍歷目錄檔案(遞迴和walk())
阿新 • • 發佈:2019-01-04
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()方法比較簡介