使用 Python 实现文件递归遍历的三种方式


Posted in Python onJuly 18, 2018

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

先发出来看看:

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):
    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, dirs, 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, dirs, nondirs

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

总结

以上所述是小编给大家介绍的使用 Python 实现文件递归遍历的三种方式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
python访问类中docstring注释的实现方法
May 04 Python
Python爬虫番外篇之Cookie和Session详解
Dec 27 Python
PyQt5每天必学之事件与信号
Apr 20 Python
Linux 修改Python命令的方法示例
Dec 03 Python
Python中的元组介绍
Jan 28 Python
Django集成CAS单点登录的方法示例
Jun 10 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 Python
anaconda如何查看并管理python环境
Jul 05 Python
详解numpy.meshgrid()方法使用
Aug 01 Python
基于Tensorflow使用CPU而不用GPU问题的解决
Feb 07 Python
什么是Python中的匿名函数
Jun 02 Python
Python制作表白爱心合集
Jan 22 Python
详解flask入门模板引擎
Jul 18 #Python
Sanic框架基于类的视图用法示例
Jul 18 #Python
flask入门之表单的实现
Jul 18 #Python
Flask入门之上传文件到服务器的方法示例
Jul 18 #Python
flask入门之文件上传与邮件发送示例
Jul 18 #Python
Sanic框架流式传输操作示例
Jul 18 #Python
django 发送邮件和缓存的实现代码
Jul 18 #Python
You might like
Yii2中关联查询简单用法示例
2016/08/10 PHP
PHP经典算法集锦【经典收藏】
2016/09/14 PHP
Laravel构建即时应用的一种实现方法详解
2017/08/31 PHP
20款非常优秀的 jQuery 工具提示插件 推荐
2012/07/15 Javascript
jquery利用ajax调用后台方法实例
2013/08/23 Javascript
JavaScript实现动态创建CSS样式规则方案
2014/09/06 Javascript
node.js中的fs.createReadStream方法使用说明
2014/12/17 Javascript
javascript实现左右控制无缝滚动
2014/12/31 Javascript
JavaScript Array对象详解
2016/03/01 Javascript
AngularJS 依赖注入详解及示例代码
2016/08/17 Javascript
Vue.js第三天学习笔记(计算属性computed)
2016/12/01 Javascript
原生js实现轮播图的示例代码
2017/02/20 Javascript
微信小程序 图片加载(本地,网路)实例详解
2017/03/10 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
vue2.0实现前端星星评分功能组件实例代码
2018/02/12 Javascript
vue.js根据代码运行环境选择baseurl的方法
2018/02/28 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
微信小程序开发之转发分享功能
2019/10/22 Javascript
Python3实现生成随机密码的方法
2014/08/23 Python
Python递归遍历列表及输出的实现方法
2015/05/19 Python
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
python模块导入的细节详解
2018/12/10 Python
详解Python odoo中嵌入html简单的分页功能
2019/05/29 Python
django自带serializers序列化返回指定字段的方法
2019/08/21 Python
Python any()函数的使用方法
2019/10/28 Python
PyQt5 QDockWidget控件应用详解
2020/08/12 Python
python 星号(*)的多种用途
2020/09/21 Python
阿提哈德航空官方网站:Etihad Airways
2017/01/06 全球购物
小车司机岗位职责
2013/11/25 职场文书
保安自我鉴定范文
2013/12/08 职场文书
物流司机岗位职责
2013/12/28 职场文书
2014大四本科生自我鉴定总结
2014/10/04 职场文书
技术转让协议书
2016/03/19 职场文书
详解Python描述符的工作原理
2021/06/11 Python
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技