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']
[]
/////