使用 Python 实现文件递归遍历的三种方式

作者:sylan215 时间:2022-08-19 18:49:08 

今天有个脚本需要遍历获取某指定文件夹下面的所有文件,我记得很早前也实现过文件遍历和目录遍历的功能,于是找来看一看,嘿,不看不知道,看了吓一跳,原来之前我竟然用了这么搓的实现。

先发出来看看:


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 实现文件递归遍历的三种方式网站的支持!

来源:https://xiaozhuanlan.com/topic/6093285471

标签:Python,递归遍历
0
投稿

猜你喜欢

  • Python OpenCV一个窗口中显示多幅图像

    2023-12-09 19:38:04
  • Python使用itchat 功能分析微信好友性别和位置

    2023-09-24 15:57:12
  • sqlserver 脚本和批处理指令小结

    2024-01-20 06:41:37
  • Vue watch原理源码层深入讲解

    2024-04-30 10:40:58
  • ASP.NET MVC实现区域或城市选择

    2023-07-13 17:50:00
  • python和flask中返回JSON数据的方法

    2023-07-31 02:43:17
  • python制作定时发送信息脚本的实现思路

    2023-01-17 15:24:11
  • python买卖股票的最佳时机(基于贪心/蛮力算法)

    2022-12-26 14:44:24
  • python用BeautifulSoup库简单爬虫实例分析

    2022-04-02 21:42:00
  • AJAX实战实现级联选择

    2009-08-21 12:27:00
  • Django中的Signal代码详解

    2023-02-23 01:20:11
  • Python 常用string函数详解

    2021-01-27 02:59:54
  • Go并发编程中sync/errGroup的使用

    2024-02-05 04:40:56
  • 有关wxpython pyqt内存占用问题分析

    2022-11-02 11:37:14
  • Python网络编程之ftplib模块

    2021-12-11 01:49:37
  • Linux 中PHP的安装教程

    2023-10-07 20:34:21
  • python实现人脸识别代码

    2022-12-20 15:39:06
  • 详解python的xlwings库读写excel操作总结

    2021-03-25 02:00:00
  • 十“问”DreamWeaver

    2007-02-03 11:39:00
  • mysql 常用数据库语句 小练习

    2024-01-16 21:27:27
  • asp之家 网络编程 m.aspxhome.com