def ergodic(folder):
for root, dirs, files in os.walk(folder):
for dir_name in dirs:
print(os.path.join(root, dir_name))
for file_name in files:
print(os.path.join(root, file_name))
上面是借助于 os 模块的 walk() 实现的基于循环的文件遍历方法。虽然是循环结构,如果不熟悉 walk() 的话,这个函数看起来还是很不直观。我更喜欢下面的递归遍历方法。
import os
def ergodic(folder):
for item in os.listdir(folder):
obj = os.path.join(folder, item)
print(obj)
if os.path.isdir(obj):
ergodic(obj)
5. 深度优先与广度优先
遍历文件通常有两种策略:深度优先搜索 DFS(depth-first search) 和广度优先搜索BFS(breadth-first search) 。顾名思义,深度优先就是优先处理本级文件夹中的子文件夹,递归向纵深发展;广度优先就是优先处理本级文件夹中的文件,递归向水平方向发展。
import os
def ergodic_DFS(folder):
"""基于深度优先的文件遍历"""
dirs, files = list(), list()
for item in os.listdir(folder):
if os.path.isdir(os.path.join(folder, item)):
dirs.append(item)
else:
files.append(item)
for dir_name in dirs:
ergodic(os.path.join(folder, dir_name))
for file_name in files
print(os.path.join(folder, file_name))
def ergodic_BFS(folder):
"""基于广度优先的文件遍历"""
dirs, files = list(), list()
for item in os.listdir(folder):
if os.path.isdir(os.path.join(folder, item)):
dirs.append(item)
else:
files.append(item)
for file_name in files
print(os.path.join(folder, file_name))
for dir_name in dirs:
ergodic(os.path.join(folder, dir_name))