使用 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进行一些简单的自然语言处理的教程
Mar 31 Python
在Python的Django框架中实现Hacker News的一些功能
Apr 17 Python
python编程之requests在网络请求中添加cookies参数方法详解
Oct 25 Python
15行Python代码带你轻松理解令牌桶算法
Mar 21 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
python 3.6.4 安装配置方法图文教程
Sep 18 Python
python+splinter自动刷新抢票功能
Sep 25 Python
django中间键重定向实例方法
Nov 10 Python
django有外键关系的两张表如何相互查找
Feb 10 Python
python3.6中anaconda安装sklearn踩坑实录
Jul 28 Python
利用Python pandas对Excel进行合并的方法示例
Nov 04 Python
python爬虫中采集中遇到的问题整理
Nov 27 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
下载文件的点击数回填
2006/10/09 PHP
php按百分比生成缩略图的代码分享
2014/05/10 PHP
php获取是星期几的的一些常用姿势
2019/12/15 PHP
PHP 范围解析操作符(::)用法分析【访问静态成员和类常量】
2020/04/14 PHP
用javascript父窗口控制只弹出一个子窗口
2007/04/10 Javascript
js 颜色选择器(兼容firefox)
2009/03/05 Javascript
JQuery页面图片切换和新闻列表滚动效果的具体实现
2013/09/26 Javascript
开源的javascript项目Kissy介绍
2014/11/28 Javascript
javascript 实现map集合
2015/04/03 Javascript
jQuery绑定事件监听bind和移除事件监听unbind用法实例详解
2016/01/19 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
js倒计时显示实例
2016/12/11 Javascript
js实现带简单弹性运动的导航条
2017/02/22 Javascript
Angular4的输入属性与输出属性实例详解
2017/11/29 Javascript
浅谈SpringMVC中post checkbox 多选框value的值(隐藏域方式)
2018/01/08 Javascript
Vue 菜单栏点击切换单个class(高亮)的方法
2018/08/22 Javascript
从源码里了解vue中的nextTick的使用
2018/11/22 Javascript
小程序实现搜索框功能
2020/03/26 Javascript
element 中 el-menu 组件的无限极循环思路代码详解
2020/04/26 Javascript
python 装饰器功能以及函数参数使用介绍
2012/01/27 Python
python 删除非空文件夹的实例
2018/04/26 Python
Python实现随机漫步功能
2018/07/09 Python
python如何基于redis实现ip代理池
2020/01/17 Python
Pyinstaller加密打包应用的示例代码
2020/06/11 Python
Microsoft新加坡官方网站:购买微软最新软件和技术产品
2016/10/28 全球购物
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
中学教师自我鉴定
2014/02/07 职场文书
外贸采购员岗位职责
2014/03/08 职场文书
进口业务员岗位职责
2014/04/06 职场文书
《四季》教学反思
2014/04/08 职场文书
勾股定理课后反思
2014/04/26 职场文书
安全生产月演讲稿
2014/05/09 职场文书
弘扬雷锋精神演讲稿
2014/05/10 职场文书
动画设计系毕业生求职信
2014/07/15 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
python自动化之如何利用allure生成测试报告
2021/05/02 Python