使用 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实现通过代理服务器访问远程url的方法
Apr 29 Python
python中将字典形式的数据循环插入Excel
Jan 16 Python
python实现mysql的读写分离及负载均衡
Feb 04 Python
python画折线图的程序
Jul 26 Python
解决Mac下首次安装pycharm无project interpreter的问题
Oct 29 Python
python绘制中国大陆人口热力图
Nov 07 Python
Python 函数list&read&seek详解
Aug 28 Python
Python基础之列表常见操作经典实例详解
Feb 26 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
Jun 24 Python
详解在Python中使用Torchmoji将文本转换为表情符号
Jul 27 Python
如何用python免费看美剧
Aug 11 Python
Python办公自动化PPT批量转换操作
Sep 15 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
header跳转和include包含问题详解
2012/09/08 PHP
php中单个数据库字段多列显示(单字段分页、横向输出)
2014/07/28 PHP
php图片水印添加、压缩、剪切的封装类实现
2020/04/18 PHP
php执行多个存储过程的方法【基于thinkPHP】
2016/11/08 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
laravel与thinkphp之间的区别与优缺点
2021/03/02 PHP
JavaScript 新手24条实用建议[TUTS+]
2009/06/21 Javascript
javascript sudoku 数独智力游戏生成代码
2010/03/27 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
JS记录用户登录次数实现代码
2014/01/15 Javascript
js阻止浏览器默认行为触发的通用方法(推荐)
2016/05/15 Javascript
jQuery表单对象属性过滤选择器实例详解
2016/09/13 Javascript
bootstrap3-dialog-master模态框使用详解
2017/08/22 Javascript
js使用原型对象(prototype)需要注意的地方
2017/08/28 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
echarts学习笔记之图表自适应问题详解
2017/11/22 Javascript
微信小程序slider组件使用详解
2018/01/31 Javascript
详解Vue Elememt-UI构建管理后台
2018/02/27 Javascript
vue组件从开发到发布的实现步骤
2018/11/11 Javascript
ES6 Promise对象概念及用法实例详解
2019/10/15 Javascript
基于JavaScript实现表格隔行换色
2020/05/08 Javascript
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
python实现神经网络感知器算法
2017/12/20 Python
Python Xml文件添加字节属性的方法
2018/03/31 Python
python3.4控制用户输入与输出的方法
2018/10/17 Python
python面向对象法实现图书管理系统
2019/04/19 Python
pytest中文文档之编写断言
2019/09/12 Python
python分布式编程实现过程解析
2019/11/08 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
卸载tensorflow-cpu重装tensorflow-gpu操作
2020/06/23 Python
使用python求斐波那契数列中第n个数的值示例代码
2020/07/26 Python
python利用 keyboard 库记录键盘事件
2020/10/16 Python
美国最大的在线水培用品商店:GrowersHouse.com
2018/08/14 全球购物
祖国在我心中演讲稿500字
2014/05/04 职场文书
中学生民族团结演讲稿
2014/08/27 职场文书
干部考核工作总结2015
2015/07/24 职场文书