1. 程式人生 > >Python學習筆記之遍歷目錄檔案(遞迴和walk())

Python學習筆記之遍歷目錄檔案(遞迴和walk())

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()方法比較簡介