使用 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利用Nagios增加微信报警通知的功能
Feb 18 Python
2018年Python值得关注的开源库、工具和开发者(总结篇)
Jan 04 Python
Python2和Python3中urllib库中urlencode的使用注意事项
Nov 26 Python
使用Django连接Mysql数据库步骤
Jan 15 Python
linux安装python修改默认python版本方法
Mar 31 Python
Python中的延迟绑定原理详解
Oct 11 Python
Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题
Feb 21 Python
关于python中的xpath解析定位
Mar 06 Python
python实现AdaBoost算法的示例
Oct 03 Python
python的dict判断key是否存在的方法
Dec 09 Python
一行代码python实现文件共享服务器
Apr 22 Python
pandas中DataFrame数据合并连接(merge、join、concat)
May 30 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数组内存耗用太多问题的解决方法
2010/04/05 PHP
PHP实现采集抓取淘宝网单个商品信息
2015/01/08 PHP
PHP输出缓冲控制Output Control系列函数详解
2015/07/02 PHP
php获取今日开始时间和结束时间的方法
2017/02/27 PHP
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
javascript 写类方式之五
2009/07/05 Javascript
基于jquery的一个简单的脚本验证插件
2010/04/05 Javascript
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
JavaScript中的16进制字符(改进)
2011/11/21 Javascript
getComputedStyle与currentStyle获取样式(style/class)
2013/03/19 Javascript
如何学习Javascript入门指导
2013/11/01 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
jQuery中[attribute^=value]选择器用法实例
2014/12/31 Javascript
关于JavaScript的变量的数据类型的判断方法
2015/08/14 Javascript
javascript使用闭包模拟对象的私有属性和方法
2016/10/05 Javascript
基于bootstrap-datetimepicker.js不支持IE8的快速解决方法
2016/11/07 Javascript
js中的触发事件对象event.srcElement与event.target详解
2017/03/15 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
微信小程序中使用wxss加载图片并实现动画效果
2018/08/13 Javascript
IE8中jQuery.load()加载页面不显示的原因
2018/11/15 jQuery
python定时执行指定函数的方法
2015/05/27 Python
Python脚本实现虾米网签到功能
2016/04/12 Python
python opencv实现任意角度的透视变换实例代码
2018/01/12 Python
1 行 Python 代码快速实现 FTP 服务器
2018/01/25 Python
python 去除txt文本中的空格、数字、特定字母等方法
2018/07/24 Python
python字典值排序并取出前n个key值的方法
2018/10/17 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
CSS3制作漂亮的照片墙的实现代码
2016/06/08 HTML / CSS
远程Wi-Fi宠物监控相机:Petcube
2017/04/26 全球购物
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
《小小雨点》教学反思
2014/02/18 职场文书
生日庆典策划方案
2014/06/02 职场文书
大学生个人求职信例文
2014/07/07 职场文书
python基础之类方法和静态方法
2021/10/24 Python
MySQL数据库完全卸载的方法
2022/03/03 MySQL