使用 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多线程结合队列下载百度音乐的方法
Jul 27 Python
Python中如何优雅的合并两个字典(dict)方法示例
Aug 09 Python
Python中字典(dict)合并的四种方法总结
Aug 10 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 Python
浅谈DataFrame和SparkSql取值误区
Jun 09 Python
pandas分别写入excel的不同sheet方法
Dec 11 Python
linux查找当前python解释器的位置方法
Feb 20 Python
Python 基于FIR实现Hilbert滤波器求信号包络详解
Feb 26 Python
python实现五子棋程序
Apr 24 Python
Python爬虫破解登陆哔哩哔哩的方法
Nov 17 Python
Python中非常使用的6种基本变量的操作与技巧
Mar 22 Python
Python&Matlab实现樱花的绘制
Apr 07 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/09/13 PHP
PHP闭包(Closure)使用详解
2013/05/02 PHP
php实现监控varnish缓存服务器的状态
2014/12/30 PHP
PHP中define() 与 const定义常量的区别详解
2019/06/25 PHP
Laravel 集成微信用户登录和绑定的实现
2019/12/27 PHP
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
跨域请求之jQuery的ajax jsonp的使用解惑
2011/10/09 Javascript
在JavaScript中判断整型的N种方法示例介绍
2014/06/18 Javascript
深入了解Node.js中的一些特性
2014/09/25 Javascript
js实现鼠标划过给div加透明度的方法
2015/05/25 Javascript
js判断文件格式及大小的简单实例(必看)
2016/10/11 Javascript
Vue2.0实现将页面中表格数据导出excel的实例
2017/08/09 Javascript
JS switch判断 三目运算 while 及 属性操作代码
2017/09/03 Javascript
vue使用$emit时,父组件无法监听到子组件的事件实例
2018/02/26 Javascript
微信小程序通过保存图片分享到朋友圈功能
2018/05/24 Javascript
Angular resolve基础用法详解
2018/10/03 Javascript
手把手教你如何使用nodejs编写cli命令行
2018/11/05 NodeJs
详解关于Vuex的action传入多个参数的问题
2019/02/22 Javascript
Vue 中使用lodash对事件进行防抖和节流操作
2020/07/26 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
TensorFlow实现AutoEncoder自编码器
2018/03/09 Python
django使用LDAP验证的方法示例
2018/12/10 Python
Python 数据可视化pyecharts的使用详解
2019/06/26 Python
Python OrderedDict的使用案例解析
2019/10/25 Python
Python hmac模块使用实例解析
2019/12/24 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
html5使用canvas画空心圆与实心圆
2014/12/15 HTML / CSS
护士专业推荐信
2013/11/02 职场文书
季度思想汇报
2014/01/01 职场文书
师范毕业生自我鉴定
2014/01/15 职场文书
学生会个人自荐书范文
2014/02/12 职场文书
党的群众路线教育实践活动个人对照检查材料(四风)
2014/11/05 职场文书
关于长城的导游词
2015/01/30 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
2016年校长新年寄语
2015/08/17 职场文书
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python