使用 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错误处理详解
Sep 28 Python
Python实现将n个点均匀地分布在球面上的方法
Mar 12 Python
python生成密码字典的方法
Jul 06 Python
Python运行不显示DOS窗口的解决方法
Oct 22 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
Dec 05 Python
python解释器spython使用及原理解析
Aug 24 Python
基于python traceback实现异常的获取与处理
Dec 13 Python
在pycharm中为项目导入anacodna环境的操作方法
Feb 12 Python
基于SpringBoot构造器注入循环依赖及解决方式
Apr 26 Python
如何学习Python time模块
Jun 03 Python
Python实现爬取并分析电商评论
Jun 19 Python
Django中Q查询及Q()对象 F查询及F()对象用法
Jul 09 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引用传值实例详解学习
2013/11/06 PHP
php用xpath解析html的代码实例讲解
2019/02/14 PHP
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
扩展JavaScript功能的正确方法(译文)
2012/04/12 Javascript
自己实现string的substring方法 人民币小写转大写,数字反转,正则优化
2012/09/02 Javascript
动态获取复选框checkbox选中个数的jquery代码
2013/06/25 Javascript
JS中FRAME的操作问题实例分析
2014/10/21 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
jquery插件orbit.js实现图片折叠轮换特效
2015/04/14 Javascript
js一维数组、多维数组和对象的混合使用方法
2016/04/03 Javascript
Bootstrap表单简单实现代码
2017/03/06 Javascript
ReactJs设置css样式的方法
2017/06/08 Javascript
用原生JS实现简单的多选框功能
2017/06/12 Javascript
layerUI下的绑定事件实例代码
2018/08/17 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧滑动,右侧不动)
2019/01/23 Javascript
vue data恢复初始化数据的实现方法
2019/10/31 Javascript
vue2.0 解决抽取公用js的问题
2020/07/31 Javascript
关于element-ui表单中限制输入纯数字的解决方式
2020/09/08 Javascript
CentOS 8.2服务器上安装最新版Node.js的方法
2020/12/16 Javascript
python读取Android permission文件
2013/11/01 Python
完美解决python遍历删除字典里值为空的元素报错问题
2016/09/11 Python
详谈Python中列表list,元祖tuple和numpy中的array区别
2018/04/18 Python
Pycharm取消py脚本中SQL识别的方法
2018/11/29 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
numpy 返回函数的上三角矩阵实例
2019/11/25 Python
python实现ftp文件传输系统(案例分析)
2020/03/20 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
什么是索引指示器
2012/08/20 面试题
公司员工的自我评价范例
2013/11/01 职场文书
2015年村党支部工作总结
2015/04/30 职场文书
2015年重阳节活动主持词
2015/07/30 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
详解Python魔法方法之描述符类
2021/05/26 Python
Java 写一个简单的图书管理系统
2022/04/26 Java/Android