下面的图是我要遍历的目录示意图:
图中的圆角矩形代表文件夹,菱形是文件。
一、用栈实现的深度优先遍历目录
import os
def get_all_dirs_deep(path):
'''深度优先遍历'''
stack=[]
stack.append((path,0))
#把我们给的文件夹路径压入栈
while len(stack)!=0:
#当栈不为空的时候,要处理栈里的目录
current_dir,level=stack.pop()
print(level*' '+'目录: '+os.path.basename(current_dir))
#把栈里的最后一个目录取出来处理
fileslist=os.listdir(current_dir)
#获取当前正在处理的目录里的文件目录
for filename in fileslist:
#针对当前处理的目录里所有的文件
fileabspath=os.path.join(current_dir,filename)
#获取每个文件的绝对路径
if os.path.isdir(fileabspath):
stack.append((fileabspath,level+1))
#如果这个文件还是目录,就打印出提示,并且压进栈,继续处理
else:
print((level+1)*' '+'普通文件: '+filename)
#如果是普通文件,就不处理了,只打印出提示
get_all_dirs_deep('D:\\爷爷')
终端:
二、用队列实现的广度优先遍历目录
import os,collections
def get_all_dirs_wide(path):
'''广度优先遍历'''
queue=collections.deque()
queue.append((path,0))
#先让我们要查看的路径进队列
while len(queue)!=0:
#当队列不空时,执行下面的代码
current_path, level=queue.popleft()
print(level*' '+"目录: "+os.path.basename(current_path))
#取出队列里排在打头位置的目录,赋给当前目录,也就是我们现在要处理的
fileslist=os.listdir(current_path)
#获取当前目录里所有的文件列表
for filename in fileslist:
#对于列表里的每个文件
fileabspath=os.path.join(current_path,filename)
#获取每个文件的绝对路径
if os.path.isdir(fileabspath):
queue.append((fileabspath,level+1))
#是目录就放进队列继续处理
else:
print((level+1)*' '+'普通文件:'+filename)
#文件就只打印提示,不需要处理了
get_all_dirs_wide('D:\\爷爷')
终端: