首頁 >後端開發 >Python教學 >python下遞歸遍歷目錄和檔案的方法介紹

python下遞歸遍歷目錄和檔案的方法介紹

零下一度
零下一度原創
2017-07-16 12:00:312325瀏覽

在日常開發中經常需要檢查一個「目錄或資料夾」內部有沒有我們想要的檔案或資料夾,以下這篇文章主要給大家介紹了關於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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn