zl程序教程

您现在的位置是:首页 >  Python

当前栏目

Python深度遍历、广度遍历、递归函数遍历目录【详细讲解】

2023-04-18 13:12:54 时间

Python通过os模块可以实现对文件或者目录的遍历,这里想实现这样的效果有三种方法,分别是递归函数遍历目录,栈深度遍历和队列广度遍历。下面就通过这三种方法来演练一下。

通过以下目录结构来演示

Python深度遍历、广度遍历、递归函数遍历目录

1.递归函数遍历目录

import os
path = r'C:UsersAdministratorDesktoppython知识总结1.python自学网-基础教程-视频源码aaa'
def getAll(path, sp=''):
    flist = os.listdir(path)
    # print(flist)
    sp += '	'
    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:UsersAdministratorDesktoppython知识总结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:UsersAdministratorDesktoppython知识总结1.python自学网-基础教程-视频源码aaaa
文件 a.txt
文件 b.txt
目录 C:UsersAdministratorDesktoppython知识总结1.python自学网-基础教程-视频源码aaaf
文件 test.py
目录 C:UsersAdministratorDesktoppython知识总结1.python自学网-基础教程-视频源码aaafc
目录 C:UsersAdministratorDesktoppython知识总结1.python自学网-基础教程-视频源码aaaf	
目录 C:UsersAdministratorDesktoppython知识总结1.python自学网-基础教程-视频源码aaaf	q
文件 11.txt
文件 3.txt
文件 5.html

3.队列遍历目录操作

import os
path = r'C:UsersAdministratorDesktoppython知识总结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