使用 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 相关文章推荐
py中的目录与文件判别代码
Jul 16 Python
Python中使用ConfigParser解析ini配置文件实例
Aug 30 Python
Python os模块介绍
Nov 30 Python
python统计cpu利用率的方法
Jun 02 Python
简单讲解Python中的数字类型及基本的数学计算
Mar 11 Python
Python 迭代器工具包【推荐】
May 06 Python
Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】
Jul 11 Python
python 监测内存和cpu的使用率实例
Nov 28 Python
python使用requests库爬取拉勾网招聘信息的实现
Nov 20 Python
selenium与xpath之获取指定位置的元素的实现
Jan 26 Python
python爬取2021猫眼票房字体加密实例
Feb 19 Python
python神经网络ResNet50模型
May 06 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
中国收音机工业发展史
2021/03/02 无线电
多文件上传的例子
2006/10/09 PHP
yii框架配置默认controller和action示例
2014/04/30 PHP
smarty中英文多编码字符截取乱码问题解决方法
2014/10/28 PHP
Yii2设置默认控制器的两种方法
2017/05/19 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
新老版本juqery获取radio对象的方法
2010/03/01 Javascript
可自定义速度的js图片无缝滚动示例分享
2014/01/20 Javascript
js数组常见操作及数组与字符串相互转化实例详解
2015/11/10 Javascript
javascript图片延迟加载实现方法及思路
2015/12/31 Javascript
JavaScript 中 apply 、call 的详解
2017/03/21 Javascript
JavaScript中三个等号和两个等号你了解多少
2017/07/04 Javascript
基于vue.js的分页插件详解
2017/11/27 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
koa socket即时通讯的示例代码
2018/09/07 Javascript
送你43道JS面试题(收藏)
2019/06/17 Javascript
Python中类型关系和继承关系实例详解
2015/05/25 Python
python集合比较(交集,并集,差集)方法详解
2018/09/13 Python
python中自带的三个装饰器的实现
2019/11/08 Python
python常用排序算法的实现代码
2019/11/08 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
python3检查字典传入函数键是否齐全的实例
2020/06/05 Python
css3动画过渡实现鼠标跟随导航效果
2018/02/08 HTML / CSS
Emporio Armani腕表天猫官方旗舰店:乔治·阿玛尼为年轻人设计的副线品牌
2017/07/02 全球购物
一个精品风格的世界:Atterley
2019/05/01 全球购物
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
如何写好建议书
2014/03/13 职场文书
踏青活动策划方案
2014/08/19 职场文书
放飞理想演讲稿
2014/09/09 职场文书
办理收楼委托书范本
2014/10/09 职场文书
基层党支部整改方案
2014/10/25 职场文书
2015年建筑工作总结报告
2015/05/04 职场文书
狼牙山五壮士观后感
2015/06/09 职场文书
2016年三严三实党课学习心得体会
2016/01/06 职场文书
教师法制教育培训学习心得体会
2016/01/14 职场文书
Nginx文件已经存在全局反向代理问题排查记录
2022/07/15 Servers