使用 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实现图片批量剪切示例
Mar 25 Python
python打开url并按指定块读取网页内容的方法
Apr 29 Python
python中list常用操作实例详解
Jun 03 Python
对pandas中iloc,loc取数据差别及按条件取值的方法详解
Nov 06 Python
Python并发:多线程与多进程的详解
Jan 24 Python
python 实现创建文件夹和创建日志文件的方法
Jul 07 Python
Django中提供的6种缓存方式详解
Aug 05 Python
Django项目创建到启动详解(最全最详细)
Sep 07 Python
numpy.array 操作使用简单总结
Nov 08 Python
快速查找Python安装路径方法
Feb 06 Python
手把手教你使用TensorFlow2实现RNN
Jul 15 Python
python之基数排序的实现
Jul 26 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
十大“创意”战术!
2020/03/04 星际争霸
分享下页面关键字抓取www.icbase.com站点代码(带asp.net参数的)
2014/01/30 PHP
PHP实现的memcache环形队列类实例
2015/07/28 PHP
基于PHP+jQuery+MySql实现红蓝(顶踩)投票代码
2015/08/25 PHP
php实现的读取CSV文件函数示例
2017/02/07 PHP
PHP基于简单递归函数求一个数阶乘的方法示例
2017/04/26 PHP
newxtree.js代码
2007/03/13 Javascript
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
js控制分页打印、打印分页示例
2014/02/08 Javascript
七个很有意思的PHP函数
2014/05/12 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
Jquery常用的方法汇总
2015/09/01 Javascript
基于chosen插件实现人员选择树搜索自动筛选功能
2016/09/24 Javascript
js实现上传图片预览方法
2016/10/25 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
JS实现DOM删除节点操作示例
2018/04/04 Javascript
[28:48]《真视界》- 2017年国际邀请赛
2017/09/27 DOTA
[57:38]2018DOTA2亚洲邀请赛3月30日 小组赛A组 OpTic VS OG
2018/03/31 DOTA
利用python代码写的12306订票代码
2015/12/20 Python
pycharm 将django中多个app放到同个文件夹apps的处理方法
2018/05/30 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
python3利用Axes3D库画3D模型图
2020/03/25 Python
Perfume’s Club意大利官网:欧洲美妆电商
2019/05/03 全球购物
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
英国最大的独立玩具专卖店:The Entertainer
2019/09/06 全球购物
北京捷通华声语音技术有限公司Java软件工程师笔试题
2012/04/10 面试题
网络工程与软件技术毕业生自荐信
2013/09/24 职场文书
商场经理竞聘演讲稿
2014/01/01 职场文书
环保专业大学生职业规划设计
2014/01/10 职场文书
小学生获奖感言范文
2014/02/02 职场文书
新员工试用期自我鉴定
2014/04/17 职场文书
学雷锋的心得体会
2014/09/04 职场文书
vue+springboot实现登录验证码
2021/05/27 Vue.js
MySQL如何使用使用Xtrabackup进行备份和恢复
2021/06/21 MySQL
vue实力踩坑之push当前页无效
2022/04/10 Vue.js