os.walk()解析

os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下

os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

1、top – 是你所要遍历的目录的地址, 返回的是一个三元组(root,dirs,files)。

(1)root 所指的是当前正在遍历的这个文件夹的本身的地址
(2)dirs 是一个 list ,指该文件夹中所有的目录的名字,不包括子目录。
(3)files 同样是 list , 指该文件夹中所有的文件,不包括子目录。

2、topdown --可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。

3、onerror – 可选,需要一个 callable 对象,当 walk 需要异常时,会调用。

4、followlinks – 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。

结构示意图:
在这里插入图片描述

        for home, dirs, files in os.walk('test_root', topdown=True):
            print(home)
            print(dirs)
            print(files)

topdown=True情况下,从根目录开始遍历。因此第一个循环输出的就是根目录下的路经信息、文件夹、文件,由于根目录下有文件夹dir1,dir2,不存在文件,因此输出的三元组为:


test_root	#path
['dir1', 'dir2']	#dirs
[]	#files
/////

接着遍历top目录下的子目录,即遍历dir1和dir2目录下的文件夹和文件。需注意的是,如二叉树的深度遍历,会先遍历dir1目录及其子目录下的文件完成后,才会进行遍历dir2目录及其子目录。完整输出如下:


test_root	#path
['dir1', 'dir2']	#dirs
[]	#files
/////
test_root\dir1
['dir11']
['file11.txt']
/////
test_root\dir1\dir11
[]
[]
///// dir1已经遍历结束,开始遍历dir2
test_root\dir2
['dir22', 'dir23']
['file22']
/////
test_root\dir2\dir22
[]
['file222']
/////
test_root\dir2\dir23
[]
[]
/////

topdown=False情况下,优先遍历子目录,最后再遍历根目录。并不是从层级最低的子目录开始遍历,如图示结构,先遍历dir1目录下的dir11子目录,dir11目录下无dir和file,因此输出三元组:

test_root\dir1\dir11
[]
[]

dir11目录遍历完成后,开始遍历dir11的上级目录,即dir1,dir1的三元组输出为:

test_root\dir1
['dir11']
['file11.txt']

dir1遍历完成后,同级目录还有dir2,因此进入遍历dir2,从dir2的最低层级子目录开始遍历,即dir222

test_root\dir2\dir22\dir222
[]
[]

由于dir222同一层级的子目录都遍历完成,进入遍历它的上级目录dir22,dir22遍历完成后进入遍历它的同层级目录dir23,同理,后续遍历顺序就是dir2-root。完整的三元组输出顺序为:

test_root\dir1\dir11
[]
[]
/////
test_root\dir1
['dir11']
['file11.txt']
/////
test_root\dir2\dir22\dir222
[]
[]
/////
test_root\dir2\dir22
['dir222']
['file222']
/////
test_root\dir2\dir23
[]
[]
/////
test_root\dir2
['dir22', 'dir23']
['file22']
/////
test_root
['dir1', 'dir2']
[]
/////

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值