使用 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,递归遍历
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
白鸦:如何设计用户体验?
2008-01-03 16:53:00
IBatis.net连接MySql 问题与故障的解决方案
2011-06-02 09:38:00
PHP函数按引用传递参数及函数可选参数用法示例
2023-11-14 11:08:06
asp 横排显示数据
2011-03-10 10:50:00
Python采集C站热榜数据实战示例
2022-05-03 13:13:13
asp如何用JMail POP3接收电子邮件?
2010-06-13 13:09:00
python内存动态分配过程详解
2023-10-02 14:58:46
![](https://img.aspxhome.com/file/2023/8/62918_0s.png)
CSS滤镜示范(filter)附源代码(静态滤镜)
2008-05-18 12:42:00
go zero微服务实战性能优化极致秒杀
2023-06-17 03:45:30
![](https://img.aspxhome.com/file/2023/4/86304_0s.jpg)
轻松解决Mysql“信息包过大”的处理方法
2008-06-07 16:50:00
Python运行不显示DOS窗口的解决方法
2021-01-18 08:06:16
如何使用AspUpload2.0组件?
2010-06-05 12:33:00
读"设计的3个C"之构图
2008-12-24 13:25:00
Centos6.5和Centos7 php环境搭建方法
2023-11-14 19:25:38
Oracle系统表外键的更名
2010-07-26 13:07:00
Http头 Range、Content-Range
2010-06-25 19:19:00
Python 动态导入对象,importlib.import_module()的使用方法
2023-01-24 01:48:47
网页广告 Banner 设计图文手册
2007-10-18 19:56:00
![](https://img.aspxhome.com/file/UploadPic/up/2007101820293575.jpg)
在cmd命令行里进入和退出Python程序的方法
2023-07-18 04:21:14
![](https://img.aspxhome.com/file/2023/0/60720_0s.jpg)
解决MySQL数据库中与优化器有关的问题
2008-12-17 16:18:00