使用 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高并发异步服务器核心库forkcore使用方法
Nov 26 Python
python中使用OpenCV进行人脸检测的例子
Apr 18 Python
python删除列表内容
Aug 04 Python
python编程开发之类型转换convert实例分析
Nov 13 Python
python结合API实现即时天气信息
Jan 19 Python
Python实现基本线性数据结构
Aug 22 Python
Python pandas常用函数详解
Feb 07 Python
python 以16进制打印输出的方法
Jul 09 Python
selenium+python自动化测试之多窗口切换
Jan 23 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
Feb 27 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 Python
django 认证类配置实现
Nov 11 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实现与ASP Banner组件相似的类
2006/10/09 PHP
THINKPHP+JS实现缩放图片式截图的实现
2010/03/07 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
记录Yii2框架开发微信公众号遇到的问题及解决方法
2018/07/20 PHP
PHP的JSON封装、转变及输出操作示例
2019/09/27 PHP
javascript getElementsByClassName 和js取地址栏参数
2010/01/02 Javascript
javascript异步编程的4种方法
2014/02/19 Javascript
jQuery通过控制节点实现仅在前台通过get方法完成参数传递
2015/02/02 Javascript
javascript实现手机震动API代码
2015/08/05 Javascript
jquery+html5烂漫爱心表白动画代码分享
2015/08/24 Javascript
详解JavaScript UTC时间转换方法
2016/01/07 Javascript
客户端验证用户名和密码的方法详解
2016/06/16 Javascript
微信小程序 require机制详解及实例代码
2016/12/14 Javascript
二维码图片生成器QRCode.js简单介绍
2017/08/18 Javascript
vue项目总结之文件夹结构配置详解
2017/12/13 Javascript
express如何使用session与cookie的方法
2018/01/30 Javascript
详解Vue 全局引入bass.scss 处理方案
2018/03/26 Javascript
在vue中读取本地Json文件的方法
2018/09/06 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
详解如何模拟实现node中的Events模块(通俗易懂版)
2019/04/15 Javascript
vue watch关于对象内的属性监听
2019/04/22 Javascript
浅谈vue中组件绑定事件时是否加.native
2019/11/09 Javascript
微信小程序使用前置摄像头拍照
2020/10/22 Javascript
微信小程序实现星星评分效果
2020/11/01 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
Python使用三种方法实现PCA算法
2017/12/12 Python
python抓取文件夹的所有文件
2018/02/27 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
Python实现查询某个目录下修改时间最新的文件示例
2018/08/29 Python
Python地图绘制实操详解
2019/03/04 Python
Python 保持登录状态进行接口测试的方法示例
2019/08/06 Python
Django框架 querySet功能解析
2019/09/04 Python
Python3基本输入与输出操作实例分析
2020/02/14 Python
舒适的豪华鞋:Taryn Rose
2018/05/03 全球购物
英国性能汽车零件和发动机配件在线:Maxpeedingrods
2019/11/05 全球购物
党校培训学习心得体会
2016/01/06 职场文书