python3中分别用递归,栈,和队列打印出目录中所有文件的绝对路径的三种方法

python3中分别用递归,栈,和队列打印出目录中所有文件的绝对路径的三种方法

第一种递归法:

思路:给一个目录要实现打印出目录中所有的文件的绝对路径,首先要打开目录,要是文件就直接打印出文件的绝对路径,要是文件夹,就重复前面的操作,就可以定义一个函数,实现打开目录,要是文件就直接打印文件的绝对路径,要是文件夹就调用自己,即递归

def getAllfileAndDirPath(sourcePath):
    if not os.path.exists(sourcePath):
        return
    listName = os.listdir(sourcePath)
    for name in listName:
        absPath = os.path.join(sourcePath,name)
        if os.path.isfile(absPath):
            print('filePath:%s' % absPath)
        if os.path.isdir(absPath):
            getAllfileAndDirPath(absPath)

getAllfileAndDirPath(r'C:\Users\Administrator\Desktop\day23')
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\code.iml
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\misc.xml
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\modules.xml
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\workspace.xml
filePath:C:\Users\Administrator\Desktop\day23\code\01连接mysql数据库.py
filePath:C:\Users\Administrator\Desktop\day23\code\02创建一个表.py
filePath:C:\Users\Administrator\Desktop\day23\code\03插入数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\04删除数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\05修改数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\06查询数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\07操作数据库工具类.py
filePath:C:\Users\Administrator\Desktop\day23\code\foodSQLUtils.py
filePath:C:\Users\Administrator\Desktop\day23\code\__pycache__\foodSQLUtils.cpython-36.pyc
filePath:C:\Users\Administrator\Desktop\day23\day23.xmind
filePath:C:\Users\Administrator\Desktop\day23\video\1.复习.avi
filePath:C:\Users\Administrator\Desktop\day23\video\10数据库操作工具类.avi
filePath:C:\Users\Administrator\Desktop\day23\video\11.图形化界面.avi
filePath:C:\Users\Administrator\Desktop\day23\video\2.表的设计.avi
filePath:C:\Users\Administrator\Desktop\day23\video\3.一对多设计.avi
filePath:C:\Users\Administrator\Desktop\day23\video\4.表的连接关系.avi
filePath:C:\Users\Administrator\Desktop\day23\video\5.多对多的设计.avi
filePath:C:\Users\Administrator\Desktop\day23\video\6.python连接数据库.avi
filePath:C:\Users\Administrator\Desktop\day23\video\7.创建表.avi
filePath:C:\Users\Administrator\Desktop\day23\video\8.插入数据.avi
filePath:C:\Users\Administrator\Desktop\day23\video\9.删除,修改,查询数据.avi
filePath:C:\Users\Administrator\Desktop\day23\一对一.png
filePath:C:\Users\Administrator\Desktop\day23\一对多关系.png
filePath:C:\Users\Administrator\Desktop\day23\事务.png
filePath:C:\Users\Administrator\Desktop\day23\多对多.png
filePath:C:\Users\Administrator\Desktop\day23\表的关联.png


Process finished with exit code 0

递归方法遍历目录与我们查看文件先后顺序是一样的,第一个遍历到底再返回上一级,以此类推,自上而下遍历

第二种方法:广度遍历

def getAllFirAndDirPath(sourPath):
    if not os.path.exists(sourPath):
        return
    queue = collections.deque()
    queue.append(sourPath)
    while True:
        if len(queue) == 0:
            return
        path = queue.popleft()
        for name in os.listdir(path):
            absPath = os.path.join(path,name)
            if os.path.isfile(absPath):
                print('filePath:%s'%absPath)
            if os.path.isdir(absPath):
                queue.append(absPath)
if __name__ == '__main__':
    getAllFirAndDirPath(r'C:\Users\Administrator\Desktop\day23')
filePath:C:\Users\Administrator\Desktop\day23\day23.xmind
filePath:C:\Users\Administrator\Desktop\day23\一对一.png
filePath:C:\Users\Administrator\Desktop\day23\一对多关系.png
filePath:C:\Users\Administrator\Desktop\day23\事务.png
filePath:C:\Users\Administrator\Desktop\day23\多对多.png
filePath:C:\Users\Administrator\Desktop\day23\表的关联.png
filePath:C:\Users\Administrator\Desktop\day23\code\01连接mysql数据库.py
filePath:C:\Users\Administrator\Desktop\day23\code\02创建一个表.py
filePath:C:\Users\Administrator\Desktop\day23\code\03插入数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\04删除数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\05修改数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\06查询数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\07操作数据库工具类.py
filePath:C:\Users\Administrator\Desktop\day23\code\foodSQLUtils.py
filePath:C:\Users\Administrator\Desktop\day23\video\1.复习.avi
filePath:C:\Users\Administrator\Desktop\day23\video\10数据库操作工具类.avi
filePath:C:\Users\Administrator\Desktop\day23\video\11.图形化界面.avi
filePath:C:\Users\Administrator\Desktop\day23\video\2.表的设计.avi
filePath:C:\Users\Administrator\Desktop\day23\video\3.一对多设计.avi
filePath:C:\Users\Administrator\Desktop\day23\video\4.表的连接关系.avi
filePath:C:\Users\Administrator\Desktop\day23\video\5.多对多的设计.avi
filePath:C:\Users\Administrator\Desktop\day23\video\6.python连接数据库.avi
filePath:C:\Users\Administrator\Desktop\day23\video\7.创建表.avi
filePath:C:\Users\Administrator\Desktop\day23\video\8.插入数据.avi
filePath:C:\Users\Administrator\Desktop\day23\video\9.删除,修改,查询数据.avi
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\code.iml
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\misc.xml
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\modules.xml
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\workspace.xml
filePath:C:\Users\Administrator\Desktop\day23\code\__pycache__\foodSQLUtils.cpython-36.pyc


Process finished with exit code 0

通过建立一个双向列表,把遍历目录得到文件直接打印文件路径,得到文件夹append添加到双向列表中,先到先取popleft,再遍历取出的文件夹,得到文件直接打印文件路径得到文件夹添加append到双向列表中,依次类推,一层一层地打印出所有文件的路径

第三种方法:深度遍历

import os
import collections

def getAllFirAndDirPath(sourPath):
    if not os.path.exists(sourPath):
        return
    queue = collections.deque()
    queue.append(sourPath)
    while True:
        if len(queue) == 0:
            return
        path = queue.popleft()
        for name in os.listdir(path):
            absPath = os.path.join(path,name)
            if os.path.isfile(absPath):
                print('filePath:%s'%absPath)
            if os.path.isdir(absPath):
                queue.appendleft(absPath)
if __name__ == '__main__':
    getAllFirAndDirPath(r'C:\Users\Administrator\Desktop\day23')
filePath:C:\Users\Administrator\Desktop\day23\day23.xmind
filePath:C:\Users\Administrator\Desktop\day23\一对一.png
filePath:C:\Users\Administrator\Desktop\day23\一对多关系.png
filePath:C:\Users\Administrator\Desktop\day23\事务.png
filePath:C:\Users\Administrator\Desktop\day23\多对多.png
filePath:C:\Users\Administrator\Desktop\day23\表的关联.png
filePath:C:\Users\Administrator\Desktop\day23\video\1.复习.avi
filePath:C:\Users\Administrator\Desktop\day23\video\10数据库操作工具类.avi
filePath:C:\Users\Administrator\Desktop\day23\video\11.图形化界面.avi
filePath:C:\Users\Administrator\Desktop\day23\video\2.表的设计.avi
filePath:C:\Users\Administrator\Desktop\day23\video\3.一对多设计.avi
filePath:C:\Users\Administrator\Desktop\day23\video\4.表的连接关系.avi
filePath:C:\Users\Administrator\Desktop\day23\video\5.多对多的设计.avi
filePath:C:\Users\Administrator\Desktop\day23\video\6.python连接数据库.avi
filePath:C:\Users\Administrator\Desktop\day23\video\7.创建表.avi
filePath:C:\Users\Administrator\Desktop\day23\video\8.插入数据.avi
filePath:C:\Users\Administrator\Desktop\day23\video\9.删除,修改,查询数据.avi
filePath:C:\Users\Administrator\Desktop\day23\code\01连接mysql数据库.py
filePath:C:\Users\Administrator\Desktop\day23\code\02创建一个表.py
filePath:C:\Users\Administrator\Desktop\day23\code\03插入数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\04删除数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\05修改数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\06查询数据.py
filePath:C:\Users\Administrator\Desktop\day23\code\07操作数据库工具类.py
filePath:C:\Users\Administrator\Desktop\day23\code\foodSQLUtils.py
filePath:C:\Users\Administrator\Desktop\day23\code\__pycache__\foodSQLUtils.cpython-36.pyc
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\code.iml
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\misc.xml
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\modules.xml
filePath:C:\Users\Administrator\Desktop\day23\code\.idea\workspace.xml

深度遍历只需要将广度遍历的文件夹的添加方向改为往左添加即可,先打印出一级目录下的文件,因为是往左添加文件夹到双向列表中的,又往左取双向列表中的元素,晚到后取,所以先遍历最下面的文件夹,依次类推,实现先深度遍历最晚添加到列表中的文件夹,再返回上一级,依次类推,实现自下而上深度遍历

def  getAllDirAndFile(sourcePath):
    if not os.path.exists(sourcePath):
        return
#   创建一个队列来存放路径
    stack = []
#   将根路径放入队列
    stack.append(sourcePath)

    while True: #不停的从队列中取
    #     当队列中没有路径时,证明遍历完了,则结束循环
        if len(stack) == 0:
            break
    #    将队列中的路径取出来
        path = stack.pop()
    #     遍历出path
        for fileName in os.listdir(path):
    #         拼接成绝对路径
            absPath = os.path.join(path,fileName)
            if os.path.isfile(absPath): #如果是文件,则直接打印
    #             复制
                print("fileName:%s"%(absPath))
            if os.path.isdir(absPath):
    #             如果是目录,则放到队列中 去
                stack.append(absPath)
#
if __name__ == '__main__':
    getAllDirAndFile(r'C:\Users\Administrator\Desktop\day23')
fileName:C:\Users\Administrator\Desktop\day23\day23.xmind
fileName:C:\Users\Administrator\Desktop\day23\一对一.png
fileName:C:\Users\Administrator\Desktop\day23\一对多关系.png
fileName:C:\Users\Administrator\Desktop\day23\事务.png
fileName:C:\Users\Administrator\Desktop\day23\多对多.png
fileName:C:\Users\Administrator\Desktop\day23\表的关联.png
fileName:C:\Users\Administrator\Desktop\day23\video\1.复习.avi
fileName:C:\Users\Administrator\Desktop\day23\video\10数据库操作工具类.avi
fileName:C:\Users\Administrator\Desktop\day23\video\11.图形化界面.avi
fileName:C:\Users\Administrator\Desktop\day23\video\2.表的设计.avi
fileName:C:\Users\Administrator\Desktop\day23\video\3.一对多设计.avi
fileName:C:\Users\Administrator\Desktop\day23\video\4.表的连接关系.avi
fileName:C:\Users\Administrator\Desktop\day23\video\5.多对多的设计.avi
fileName:C:\Users\Administrator\Desktop\day23\video\6.python连接数据库.avi
fileName:C:\Users\Administrator\Desktop\day23\video\7.创建表.avi
fileName:C:\Users\Administrator\Desktop\day23\video\8.插入数据.avi
fileName:C:\Users\Administrator\Desktop\day23\video\9.删除,修改,查询数据.avi
fileName:C:\Users\Administrator\Desktop\day23\code\01连接mysql数据库.py
fileName:C:\Users\Administrator\Desktop\day23\code\02创建一个表.py
fileName:C:\Users\Administrator\Desktop\day23\code\03插入数据.py
fileName:C:\Users\Administrator\Desktop\day23\code\04删除数据.py
fileName:C:\Users\Administrator\Desktop\day23\code\05修改数据.py
fileName:C:\Users\Administrator\Desktop\day23\code\06查询数据.py
fileName:C:\Users\Administrator\Desktop\day23\code\07操作数据库工具类.py
fileName:C:\Users\Administrator\Desktop\day23\code\foodSQLUtils.py
fileName:C:\Users\Administrator\Desktop\day23\code\__pycache__\foodSQLUtils.cpython-36.pyc
fileName:C:\Users\Administrator\Desktop\day23\code\.idea\code.iml
fileName:C:\Users\Administrator\Desktop\day23\code\.idea\misc.xml
fileName:C:\Users\Administrator\Desktop\day23\code\.idea\modules.xml
fileName:C:\Users\Administrator\Desktop\day23\code\.idea\workspace.xml

此方法是通过列表append和pop模拟栈的结构,先进晚出,浅显理解为从右边添加文件夹从右边取出文件夹遍历里面所有的文件和文件夹的路径,与上面的从左边添加文件夹从左边取出文件夹遍历是一样的.