使用 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将人民币转换大写的脚本代码
Feb 10 Python
python列表去重的二种方法
Feb 14 Python
windows下wxPython开发环境安装与配置方法
Jun 28 Python
Python中用函数作为返回值和实现闭包的教程
Apr 27 Python
Python内置函数delattr的具体用法
Nov 23 Python
python 定义给定初值或长度的list方法
Jun 23 Python
python try 异常处理(史上最全)
Mar 07 Python
python实现提取str字符串/json中多级目录下的某个值
Feb 27 Python
Python3内置函数chr和ord实现进制转换
Jun 05 Python
python脚本和网页有何区别
Jul 02 Python
Python 发送邮件方法总结
Aug 10 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
Feb 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
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
浅谈PHP链表数据结构(单链表)
2016/06/08 PHP
php简单计算年龄的方法(周岁与虚岁)
2016/12/06 PHP
PHP设计模式(六)桥连模式Bridge实例详解【结构型】
2020/05/02 PHP
让iframe框架网页在任何浏览器下自动伸缩
2006/08/18 Javascript
JavaScript:new 一个函数和直接调用函数的区别分析
2013/07/10 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
javascript获取本机操作系统类型的方法
2015/08/13 Javascript
javascript实现倒计时跳转页面
2016/01/17 Javascript
JS中判断字符串存在和非空的方法
2018/09/12 Javascript
解决IE11 vue +webpack 项目中数据更新后页面没有刷新的问题
2018/09/25 Javascript
详解如何探测小程序返回到webview页面
2019/05/14 Javascript
Vee-validate 父组件获取子组件表单校验结果的实例代码
2019/05/20 Javascript
JS继承定义与使用方法简单示例
2020/02/19 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
详解Vue的七种传值方式
2021/02/08 Vue.js
[00:27]DOTA2荣耀之路2:Patience from zhou!
2018/05/24 DOTA
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
Django密码系统实现过程详解
2019/07/19 Python
python 类的继承 实例方法.静态方法.类方法的代码解析
2019/08/23 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
python求numpy中array按列非零元素的平均值案例
2020/06/08 Python
HTML5 Canvas 实现圆形进度条并显示数字百分比效果示例
2017/08/18 HTML / CSS
俄罗斯香水在线商店:AromaCode
2019/12/04 全球购物
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
宣传策划类求职信范文
2014/01/31 职场文书
公证委托书大全
2014/04/04 职场文书
社会稳定风险评估方案
2014/06/02 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
职业规划从高考志愿专业选择开始
2019/08/08 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
JS实现简单控制视频播放倍速的实例代码
2021/04/18 Javascript
两行代码解决Jupyter Notebook中文不能显示的问题
2021/04/24 Python
微软Win11有哪些隐藏功能? windows11多个功能汇总
2021/11/21 数码科技