使用 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实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
Python中处理字符串之endswith()方法的使用简介
May 18 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
Jun 17 Python
使用Python简单的实现树莓派的WEB控制
Feb 18 Python
利用Python实现图书超期提醒
Aug 02 Python
python爬虫实战之最简单的网页爬虫教程
Aug 13 Python
Python二叉树的定义及常用遍历算法分析
Nov 24 Python
python学习笔记--将python源文件打包成exe文件(pyinstaller)
May 26 Python
Python----数据预处理代码实例
Mar 20 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
Python浮点型(float)运算结果不正确的解决方案
Sep 22 Python
python给list排序的简单方法
Dec 10 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
PHP超级全局变量数组小结
2012/10/04 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
悄悄用脚本检查你访问过哪些网站的代码
2010/12/04 Javascript
关于JavaScript中name的意义冲突示例介绍
2014/05/29 Javascript
JavaScript中双叹号!!作用示例介绍
2014/09/21 Javascript
jquery使用each方法遍历json格式数据实例
2015/05/18 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
javascript小数精度丢失的完美解决方法
2016/05/31 Javascript
jQuery时间日期三级联动(推荐)
2016/11/27 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
JS实现的简单图片切换功能示例【测试可用】
2017/02/14 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
详解webpack babel的配置
2018/01/09 Javascript
vue实现编辑器键盘抬起时内容跟随光标距顶位置向上滚动效果
2020/05/28 Javascript
[46:43]DOTA2上海特级锦标赛D组小组赛#1 EG VS COL第三局
2016/02/28 DOTA
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
[47:18]完美世界DOTA2联赛循环赛 IO vs FTD BO2第一场 11.05
2020/11/06 DOTA
介绍Python中的fabs()方法的使用
2015/05/14 Python
安装python3的时候就是输入python3死活没有反应的解决方法
2018/01/24 Python
python实现爬取图书封面
2018/07/05 Python
python使用turtle绘制国际象棋棋盘
2019/05/23 Python
基于python实现的百度音乐下载器python pyqt改进版(附代码)
2019/08/05 Python
CSS3过渡transition效果实例介绍
2016/05/03 HTML / CSS
纽约服装和生活方式品牌:Saturdays NYC
2017/08/13 全球购物
阿迪达斯新加坡官方网站:adidas新加坡
2019/12/06 全球购物
中药专业毕业自荐书范文
2014/02/08 职场文书
创新社会管理心得体会
2014/09/12 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
学生党员检讨书范文
2014/12/27 职场文书
离婚承诺书格式范文
2015/05/04 职场文书
2015年大学辅导员工作总结
2015/05/12 职场文书
导游词之西湖雷峰塔
2019/09/18 职场文书
MongoDB orm框架的注意事项及简单使用
2021/06/20 MongoDB
能让Python提速超40倍的神器Cython详解
2021/06/24 Python