Python通过os模块可以实现对文件或者目录的遍历,这里想实现这样的效果有三种方法,分别是递归函数遍历目录,使用栈深度遍历和使用队列广度遍历。下面就通过这三种方法来演练一下。
通过以下目录结构来演示
1.递归函数遍历目录
import os
path = r'C:\Users\Administrator\Desktop\python知识总结\1.python自学网-基础教程-视频源码\aaa'
def getAll(path, sp=''):
flist = os.listdir(path)
# print(flist)
sp += '\t'
for f in flist: # 遍历目录,得到所有文件和目录
if os.path.isdir(os.path.join(path, f)): # os.path.join(path, f)拼接路径,否则只会返回文件名或者目录名
print(sp, '目录', f)
getAll(os.path.join(path, f), sp) # 回调一下原函数处理
else:
print(sp, '文件', f)
getAll(path)
返回内容比较长
文件 111.jpg
文件 123.jpg
目录 a
文件 3.txt
文件 5.html
文件 a.txt
文件 b.txt
目录 f
目录 c
文件 11.txt
目录 t
目录 q
文件 test.py
2.栈结构遍历目录
import os
path = r'C:\Users\Administrator\Desktop\python知识总结\1.python自学网-基础教程-视频源码\aaa'
# 栈结构遍历又可以看做深度遍历
def getDeep(path):
# 1.先压栈
stack = []
stack.append(path) # 压栈
# print(stack)
# 2.处理栈中数据,如果为空结束循环
while len(stack) != 0:
# 从栈中取数据/目录
dpath = stack.pop()
# print(dpath)
# 目录下的所有文件和目录
flist = os.listdir(dpath)
# 遍历目录
for fname in flist:
if not os.path.isdir(os.path.join(dpath, fname)):
# 不是目录就打印
print('文件', fname)
else:
# 是目录就压栈
print('目录', os.path.join(dpath, fname))
# 压栈之后for循环结束,再走一遍while循环,只要len(stack) != 0,一直下去
stack.append(os.path.join(dpath, fname))
# 深度遍历很难实现层级关系
getDeep(path)
返回结果:
文件 111.jpg
文件 123.jpg
目录 C:\Users\Administrator\Desktop\python知识总结\1.python自学网-基础教程-视频源码\aaa\a
文件 a.txt
文件 b.txt
目录 C:\Users\Administrator\Desktop\python知识总结\1.python自学网-基础教程-视频源码\aaa\f
文件 test.py
目录 C:\Users\Administrator\Desktop\python知识总结\1.python自学网-基础教程-视频源码\aaa\f\c
目录 C:\Users\Administrator\Desktop\python知识总结\1.python自学网-基础教程-视频源码\aaa\f\t
目录 C:\Users\Administrator\Desktop\python知识总结\1.python自学网-基础教程-视频源码\aaa\f\t\q
文件 11.txt
文件 3.txt
文件 5.html
3.队列遍历目录操作
import os
path = r'C:\Users\Administrator\Desktop\python知识总结\1.python自学网-基础教程-视频源码\aaa'
from collections import *
def getWidth(path):
# 创建队列
queue = deque()
# 进队
queue.append(path)
while len(queue) != 0:
# 数据出队
dpath = queue.popleft()
# 遍历目录中所有目录和文件,是目录继续遍历,不是目录打印出来
flist = os.listdir(dpath)
for fname in flist:
if not os.path.isdir(os.path.join(dpath, fname)):
print('文件', fname)
else:
print('目录', fname)
queue.append(os.path.join(dpath, fname))
getWidth(path)
返回结果:
文件 111.jpg
文件 123.jpg
目录 a
文件 a.txt
文件 b.txt
目录 f
文件 test.py
文件 3.txt
文件 5.html
目录 c
目录 t
文件 11.txt
目录 q