首页 python基础教程 Python深度遍历和广度遍历
pay

Python深度遍历和广度遍历

日期: 2021年12月1日 19:54
栏目: python基础教程
阅读: 54
作者: python自学网

摘要: Python通过os模块可以实现对文件或者目录的遍历,这里想实现这样的效果有三种方法,分别是递归函数遍历目录,使用栈深度遍历和使用队列广度遍历。

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

回顶部