您好,欢迎来到飒榕旅游知识分享网。
搜索
您的当前位置:首页python下递归遍历目录和文件的方法介绍

python下递归遍历目录和文件的方法介绍

来源:飒榕旅游知识分享网
在日常开发中经常需要检查一个“目录或文件夹”内部有没有我们想要的文件或者文件夹,下面这篇文章主要给大家介绍了关于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:UserszsPycharmProjectsdemo"
 allfiles=getallfile(path)

 for item in allfiles:
 print item


#结果
C:UserszsPycharmProjectsdemo.ideademo.iml
C:UserszsPycharmProjectsdemo.ideaencodings.xml
C:UserszsPycharmProjectsdemo.ideamisc.xml
C:UserszsPycharmProjectsdemo.ideamodules.xml
C:UserszsPycharmProjectsdemo.ideaworkspace.xml
C:UserszsPycharmProjectsdemo.idea
C:UserszsPycharmProjectsdemofunctiondemo.py
C:UserszsPycharmProjectsdemoindex.py
C:UserszsPycharmProjectsdemolocaleen_USLC_MESSAGESdjango.po
C:UserszsPycharmProjectsdemolocaleen_USLC_MESSAGES
C:UserszsPycharmProjectsdemolocaleen_US
C:UserszsPycharmProjectsdemolocalezh_CNLC_MESSAGESlang.mo
C:UserszsPycharmProjectsdemolocalezh_CNLC_MESSAGESlang.po
C:UserszsPycharmProjectsdemolocalezh_CNLC_MESSAGES
C:UserszsPycharmProjectsdemolocalezh_CN
C:UserszsPycharmProjectsdemolocale
C:UserszsPycharmProjectsdemo
ame.txt
C:UserszsPycharmProjectsdemo	ext.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:UserszsPycharmProjectsdemo"
     allfile=getallfiles(path)
     for file in allfile:
     print file
    
    
    
    
    #
    输出结果 C:UserszsPycharmProjectsdemo.idea C:UserszsPycharmProjectsdemolocale C:UserszsPycharmProjectsdemofunctiondemo.py C:UserszsPycharmProjectsdemoindex.py C:UserszsPycharmProjectsdemo ame.txt C:UserszsPycharmProjectsdemo ext.txt C:UserszsPycharmProjectsdemo.ideademo.iml C:UserszsPycharmProjectsdemo.ideaencodings.xml C:UserszsPycharmProjectsdemo.ideamisc.xml C:UserszsPycharmProjectsdemo.ideamodules.xml C:UserszsPycharmProjectsdemo.ideaworkspace.xml C:UserszsPycharmProjectsdemolocaleen_US C:UserszsPycharmProjectsdemolocalezh_CN C:UserszsPycharmProjectsdemolocaleen_USLC_MESSAGES C:UserszsPycharmProjectsdemolocaleen_USLC_MESSAGESdjango.po C:UserszsPycharmProjectsdemolocalezh_CNLC_MESSAGES C:UserszsPycharmProjectsdemolocalezh_CNLC_MESSAGESlang.mo C:UserszsPycharmProjectsdemolocalezh_CNLC_MESSAGESlang.po

    小结

    两种方法输入结果是一样的。但是在输入的顺序有差异。对比感觉python的os模块的walk()方法比较简

    Copyright © 2019- sarr.cn 版权所有

    违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

    本站由北京市万商天勤律师事务所王兴未律师提供法律服务