递归遍历目录很常见,拿python举例,比如:
def show_files(base_path, res_data_list):
"""
遍历目录(递归实现)
:param base_path: 要获取它下面所有文件的路径
:param res_data_list: 收集结果的列表
"""
file_list = os.listdir(base_path)
for file in file_list:
# 利用os.path.join()方法取得路径全名,并存入cur_path变量,否则每次只能遍历一层目录
cur_path = os.path.join(base_path, file)
# 判断是否是文件夹
if os.path.isdir(cur_path):
show_files(cur_path, res_data_list)
else:
res_data_list.append(cur_path)
if __name__ == '__main__':
path = "C:/Home/python/project/python_draft/tes_data2"
# 递归
result_list = []
show_files(path, result_list)
# print(res_data)
print(len(result_list)) # 结果23913
但是非递归的方式该怎么做呢?这里可以使用stack实现,比如:
def list_files(base_path, res_data_list):
"""
遍历目录(非递归实现)
:param base_path: 要获取它下面所有文件的路径
:param res_data_list: 收集结果的列表
"""
stack = LifoQueue() # 使用栈来存储目录路径
stack.put(base_path)
while stack.qsize() != 0:
current_dir = stack.get() # 弹出栈顶元素
for item in os.listdir(current_dir):
item_path = os.path.join(current_dir, item)
if os.path.isdir(item_path):
stack.put(item_path) # 将子目录添加到栈中
else:
res_data_list.append(item_path) # 这里收集文件路径
if __name__ == '__main__':
path = "C:/Home/python/project/python_draft/tes_data2"
# 非递归
result_list2 = []
list_files(path, result_list2)
# print(result_list2)
print(len(result_list2)) # 结果23913
使用列表实现:
def show_files_by_list(base_path, res_data_list):
"""
遍历目录(使用列表实现)
:param base_path: 要获取它下面所有文件的路径
:param res_data_list: 收集结果的列表
"""
path_list = list() # 使用列表来存储目录路径
path_list.append(base_path)
while path_list:
current_dir = path_list.pop()
for item in os.listdir(current_dir):
item_path = os.path.join(current_dir, item)
if os.path.isdir(item_path):
path_list.append(item_path) # 将子目录添加到栈中
else:
res_data_list.append(item_path)
if __name__ == '__main__':
path = "C:/Home/python/project/python_draft/tes_data2"
# 列表实现
result_list3 = []
show_files_by_list(path, result_list3)
# print(result_list2)
print(len(result_list3)) # 结果23913