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

### 对 `os.walk` 结果进行排序 当使用 `os.walk('path')` 函数遍历目录结构时,默认情况下返回的结果并不保证任何特定顺序。为了实现对文件名或路径的排序,可以在处理过程中加入自定义排序逻辑。 #### 按文件名排序 如果目标是对每个目录中的文件列表按照名称排序,则可以修改每次迭代时获取到的 `(dirpath, dirnames, filenames)` 中的 `filenames` 部分: ```python import os for root, dirs, files in os.walk('target_directory'): # 对当前目录下的文件按名字升序排列 sorted_files = sorted(files) # 如果还需要对子目录也做同样操作 dirs[:] = sorted(dirs) for name in sorted_files: print(os.path.join(root, name)) ``` 此方法通过内置 `sorted()` 函数直接作用于 `files` 列表来获得已排序版本,并不影响原始数据流[^1]。 #### 自定义排序规则 对于更复杂的排序需求,比如基于文件名中包含的具体数值部分或其他特征字段,可以通过传递给 `sort()` 或者 `sorted()` 方法一个键函数来进行定制化排序。例如,假设要依据文件名中某一段数字序列进行排序: ```python import os def extract_number(filename): try: return int(filename[13:15]) # 假设是从索引位置13开始长度为两位数的位置提取整数作为排序关键字 except ValueError: return float('inf') for root, dirs, files in os.walk('target_directory'): # 使用lambda表达式简化上述功能 sorted_files = sorted(files, key=extract_number) for name in sorted_files: print(os.path.join(root, name)) ``` 这里展示了如何利用辅助函数 `extract_number` 来解析并比较文件名内的指定模式,从而影响最终输出顺序[^2]。 #### 完整示例:同时考虑路径和文件名排序 有时可能不仅希望对单个目录内部的内容排序,还想要整个树状结构下所有条目都遵循某种全局有序性。这通常涉及到先构建完整的绝对路径再对其进行统一排序: ```python import os all_entries = [] for root, _, files in os.walk('target_directory'): all_entries.extend([os.path.join(root, f) for f in files]) # 先按路径排序,再按文件名排序 all_sorted_paths = sorted(all_entries) for path in all_sorted_paths: print(path) ``` 这种方法首先收集所有的文件路径至单一列表内,之后一次性完成整体排序过程。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值