网络上不缺乏os.walk()方法的介绍,但很多都是千篇一律的转载,查看了很多文档基本都基于官方文档。
如下网址,都有详细的介绍:
[https://www.tutorialspoint.com/python/os_walk.htm]
[https://docs.python.org/3/library/os.html]
1. 基本的使用和介绍
熟悉文档定义的开发者,请跳过这一段。
os.walk()方法
os.walk() 方法可以创建一个生成器,用以生成所要查找的目录及其子目录下的所有文件。
os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。
os.walk() 方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情。
在Unix,Windows中有效
语法格式
os.walk(top[, topdown=True[, οnerrοr=None[, followlinks=False]]])
参数
- top 是你所要遍历的目录的地址, 返回的是一个三元组(dirpath, dirnames, filenames)
[文件夹路径, 文件夹名字, 文件名]
- dirpath 所指的是当前正在遍历的这个文件夹的本身的地址
- dirnames 是一个 list ,内容是该文件夹中所有的目录的名字(不包括目录的子目录)
- filenames 同样是 list , 内容是该文件夹中所有的文件(不包括子目录下的文件)
- topdown 可选,为 True,则优先遍历 top 目录,否则优先遍历 top 的子目录(默认为开启)。如果 topdown 参数为 True,walk 会遍历top文件夹,与top 文件夹中每一个子目录。
- onerror 可选,,是一个函数; 它调用时有一个参数, 一个OSError实例。报告这错误后,继续walk,或者抛出exception终止walk。
- followlinks 可选,如果为 True,则会遍历目录下的快捷方式(linux 下是软连接 symbolic link )实际所指的目录(默认关闭),如果为 False,则优先遍历 top 的子目录。设置为 true,则通过软链接访问目录。
返回值
返回生成器
范例
def walkFile(file):
for root, dirs, files in os.walk(file):
# root 表示当前正在访问的文件夹路径
# dirs 表示该文件夹下的子目录名list
# files 表示该文件夹下的文件list
# 遍历文件
for f in files:
print(os.path.join(root, f))
# 遍历所有的文件夹
for d in dirs:
print(os.path.join(root, d))
为了更好的理解上函数,根目录,根目录下的子目录,根目录下的文件,子目录下的文件,创建以演示的嵌套文件夹和文件。
创建一个嵌套的文件夹:
创建任意的文本文件, 文件名称分布如下:
—> D:\Test :
-------新建文本文档 - 副本 (2).txt
-------新建文本文档 - 副本 (3).txt
-------新建文本文档 - 副本.txt
-------新建文本文档.txt
—> D:\Test\Test1 :
-------------S1新建文本文档 - 副本 (2).txt
-------------S1新建文本文档 - 副本.txt
-------------S1新建文本文档.txt
—> D:\Test\Test2 :
-------------S2新建文本文档 - 副本 (2).txt
-------------S2新建文本文档 - 副本.txt
-------------S2新建文本文档.txt
—> D:\Test\Test2\Test2_1 :
---------------------子目录2下的子目录的文件 - 副本.txt
---------------------子目录2下的子目录的文件.txt
测试如下:
import os
def Basic_Walk(target_path):
for root, sub_folders, filesin os.walk(target_path):
for subfolderin sub_folders:
print(subfolder)
print(“子文件夹为:”)
Basic_Walk(r’D:\Test’)
输出为:
子文件夹为:
Test1
Test2
Test2_1
和创建的子文件一致
def Basic_Walk(target_path):
for root, sub_folders, filesin os.walk(target_path):
for fileNamein files:
print(fileName)
print(“子文件为:”)
Basic_Walk(r’D:\Test’)
输出:
子文件为:
新建文本文档 - 副本 (2).txt
新建文本文档 - 副本 (3).txt
新建文本文档 - 副本.txt
新建文本文档.txt
上面的4个文件为根目录的文件,即在D:\Test目录下的文件
S1新建文本文档 - 副本 (2).txt
S1新建文本文档 - 副本.txt
S1新建文本文档.txt
上面的3个文件为子目录的文件,即在D:\Test\Test1目录下的文件
S2新建文本文档 - 副本 (2).txt
S2新建文本文档 - 副本.txt
S2新建文本文档.txt
上面的3个文件为第2个子目录的文件,即在D:\Test\Test2目录下的文件
在子目录2下还有一个子目录 Test2_1,如下2个文件是子目录下的子目录的文件。
子目录2下的子目录的文件 - 副本.txt
子目录2下的子目录的文件.txt
上面的代码和文字已经很好的演示了遍历指定文件夹下的所有文件和子文件夹。
2. 依据上面的知识,做特殊文件处理
格式化展示
def Get_subFolders(theFolder):
for root, subFolders, filesin os.walk(theFolder):
for din subFolders:
print(d)
print("-" *30)
# 获取子文件夹名称
Get_subFolders(r"D:\Test")
输出:
Test1
------------------------------
Test2
------------------------------
Test2_1
------------------------------
输出3个子文件夹的名称,如果需要操作文件夹,我们一般需要完整路径,如下代码展示如下获取完整子文件夹:
def Get_subFolders_with_Directory(theFolder):
for root, subFolders, filesin os.walk(theFolder):
for din subFolders:
print(os.path.join(root, d))
print("-" *30)
输出:
D:\Test\Test1
------------------------------
D:\Test\Test2
------------------------------
D:\Test\Test2\Test2_1
------------------------------
# 获取子文件名称,包含完整路径,如果不需要路径,不去join 路径即可
def Get_file_with_Directory(theFolder):
for root, subFolders, filesin os.walk(theFolder):
for fin files:
print(os.path.join(root, f))
print("-" *30)
# 获取文件全路径(包含完整路径)
Get_file_with_Directory(r"D:\Test")
输出:
D:\Test\新建文本文档 - 副本 (2).txt
D:\Test\新建文本文档 - 副本 (3).txt
D:\Test\新建文本文档 - 副本.txt
D:\Test\新建文本文档.txt
------------------------------
D:\Test\Test1\S1新建文本文档 - 副本 (2).txt
D:\Test\Test1\S1新建文本文档 - 副本.txt
D:\Test\Test1\S1新建文本文档.txt
------------------------------
D:\Test\Test2\S2新建文本文档 - 副本 (2).txt
D:\Test\Test2\S2新建文本文档 - 副本.txt
D:\Test\Test2\S2新建文本文档.txt
------------------------------
D:\Test\Test2\Test2_1\子目录2下的子目录的文件 - 副本.txt
D:\Test\Test2\Test2_1\子目录2下的子目录的文件.txt
------------------------------
每个文件夹中的文件很清楚,使用分割线隔开。
有时需要一个更清晰的层级结构,使用如下方式:
—> D:\Test :
-------新建文本文档 - 副本 (2).txt
-------新建文本文档 - 副本 (3).txt
-------新建文本文档 - 副本.txt
-------新建文本文档.txt
—> D:\Test\Test1 :
-------------S1新建文本文档 - 副本 (2).txt
-------------S1新建文本文档 - 副本.txt
-------------S1新建文本文档.txt
—> D:\Test\Test2 :
-------------S2新建文本文档 - 副本 (2).txt
-------------S2新建文本文档 - 副本.txt
-------------S2新建文本文档.txt
—> D:\Test\Test2\Test2_1 :
---------------------子目录2下的子目录的文件 - 副本.txt
---------------------子目录2下的子目录的文件.txt
实现代码函数如下:
def Get_Struct_From_Folder(TheFolder):
for cur, _dirs, filesin os.walk(TheFolder):
head, tail = os.path.split(cur)
print(’—>’, cur, ‘:’)# 路径
for fin files:
print(’-’ *len(cur)+f)# 文件
print()
更加清晰展示目录以及目录下的文件,子文件包含了根目录的路径D:\Test
下面更新另一种展示的格式:
— Test
------ 新建文本文档 - 副本 (2).txt
------ 新建文本文档 - 副本 (3).txt
------ 新建文本文档 - 副本.txt
------ 新建文本文档.txt
------ Test1
--------- S1新建文本文档 - 副本 (2).txt
--------- S1新建文本文档 - 副本.txt
--------- S1新建文本文档.txt
------ Test2
--------- S2新建文本文档 - 副本 (2).txt
--------- S2新建文本文档 - 副本.txt
--------- S2新建文本文档.txt
--------- Test2_1
------------ 子目录2下的子目录的文件 - 副本.txt
------------ 子目录2下的子目录的文件.txt
4个子目录和对应的文件展示如上。可以下不看实现代码尝试实现一下。
实现代码如下:
def Show_Folder_struct(TheFolder):
for root, dirs, filesin os.walk(TheFolder, topdown=True):
path = root.split(os.sep)
print((len(path) -1) *’—’, os.path.basename(root))
for filein files:
print(len(path) *’—’, file)
print()
# 测试运行验证
Show_Folder_struct(r’D:\Test’)
因为这函数的应用很广泛,很难一篇文章讲解完,明天再更新其它更深层的应用。