如何优雅的使用 Python 实现文件递归遍历!

如何优雅的使用 Python 实现文件递归遍历!,第1张

概述今天有个脚本需要遍历获取某指定文件夹下面的所有文件,我记得很早前也实现过文件遍历和目录遍历的功能,于是找来看一看,嘿,不看不知道,看了吓一跳,原来之前我竟然用了这么搓的实现。

今天有个脚本需要遍历获取某指定文件夹下面的所有文件,我记得很早前也实现过文件遍历和目录遍历的功能,于是找来看一看,嘿,不看不知道,看了吓一跳,原来之前我竟然用了这么搓的实现。

先发出来看看:

def getallfiles(dir):"""遍历获取指定文件夹下面所有文件"""  if os.path.isdir(dir): fileList = os.Listdir(dir) for ret in fileList: filename = dir + "\" + ret if os.path.isfile(filename): print filename

def getalldirfiles(dir,basedir):
"""遍历获取所有子文件夹下面所有文件"""
if os.path.isdir(dir):
muiop[]
sdrtyuiop[]
getallfiles(dir)
dirList = os.Listdir(dir)
for dirret in dirList:
fullname = dir + "\" + dirret
if os.path.isdir(fullname):
getalldirfiles(fullname,basedir)

我是用了 2 个函数,并且每个函数都用了一次 Listdir,只是一次用来过滤文件,一次用来过滤文件夹,如果只是从功能实现上看,一点问题没有,但是这…太不优雅了吧。

开始着手优化,方案一:

def getallfiles(dir):"""使用Listdir循环遍历"""  if not os.path.isdir(dir): print dir return  dirList = os.Listdir(dir) for dirret in dirList: fullname = dir + "\" + dirret if os.path.isdir(fullname): getallfiles(fullname) else: print fullname

从上图可以看到,我把两个函数合并成了一个,只调用了一次 Listdir,把文件和文件夹用 if else 进行了分支处理,当然,自我调用的循环还是存在。

有木有更好的方式呢?网上一搜一大把,原来有一个现成的 os.walk() 函数可以用来处理文件(夹)的遍历,这样优化下就更简单了。

方案二:

def getallfilesofwalk(dir):"""使用Listdir循环遍历"""  if not os.path.isdir(dir): print dir return  dirList = os.walk(dir) for root,dirs,files in dirList: for file in files: print os.path.join(root,file)

只是从代码实现上看,方案二是最优雅简洁的了,但是再翻看 os.walk() 实现的源码就会发现,其实它内部还是调用的 Listdir 完成具体的功能实现,只是它对输出结果做了下额外的处理而已。

附上os.walk()的源码:

from os.path import join,isdir,islink# We may not have read permission for top,in which case we can't# get a List of the files the directory contains. os.path.walk# always suppressed the exception then,rather than blow up for a# minor reason when (say) a thousand readable directorIEs are still# left to visit. That logic is copIEd here.try: # Note that Listdir and error are globals in this module due  # to earlIEr import-*.  names = Listdir(top)except error,err: if onerror is not None: onerror(err) return

dirs,nondirs = [],[]
for name in names:
if isdir(join(top,name)):
dirs.append(name)
else:
nondirs.append(name)

if topdown:
yIEld top,nondirs
for name in dirs:
path = join(top,name)
if followlinks or not islink(path):
for x in walk(path,topdown,onerror,followlinks):
yIEld x
if not topdown:
yIEld top,nondirs

至于 Listdir 和 walk 在输出时的不同点,主要就是Listdir 默认是按照文件和文件夹存放的字母顺序进行输出,而 walk 则是先输出顶级文件夹,然后是顶级文件,再输出第二级文件夹,以及第二级文件,以此类推,具体大家可以把上面脚本拷贝后自行验证。

结语:

跟大家推荐一个学习资料分享群: 960410445 ,里面大牛已经为我们整理好了许多的学习资料,有自动化,接口,性能

总结

以上是内存溢出为你收集整理的如何优雅的使用 Python 实现文件递归遍历!全部内容,希望文章能够帮你解决如何优雅的使用 Python 实现文件递归遍历!所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1208442.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存