python非递归遍历目录

递归遍历目录很常见,拿python举例,比如:

def show_files(base_path, res_data_list):
    """
    遍历目录(递归实现)
    :param base_path: 要获取它下面所有文件的路径
    :param res_data_list: 收集结果的列表
    """
    file_list = os.listdir(base_path)
    for file in file_list:
        # 利用os.path.join()方法取得路径全名,并存入cur_path变量,否则每次只能遍历一层目录
        cur_path = os.path.join(base_path, file)
        # 判断是否是文件夹
        if os.path.isdir(cur_path):
            show_files(cur_path, res_data_list)
        else:
            res_data_list.append(cur_path)


if __name__ == '__main__':
    path = "C:/Home/python/project/python_draft/tes_data2"
    # 递归
    result_list = []
    show_files(path, result_list)
    # print(res_data)
    print(len(result_list))     # 结果23913

 但是非递归的方式该怎么做呢?这里可以使用stack实现,比如:

def list_files(base_path, res_data_list):
    """
    遍历目录(非递归实现)
    :param base_path: 要获取它下面所有文件的路径
    :param res_data_list: 收集结果的列表
    """
    stack = LifoQueue()  # 使用栈来存储目录路径
    stack.put(base_path)
    while stack.qsize() != 0:
        current_dir = stack.get()  # 弹出栈顶元素
        for item in os.listdir(current_dir):
            item_path = os.path.join(current_dir, item)
            if os.path.isdir(item_path):
                stack.put(item_path)  # 将子目录添加到栈中
            else:
                res_data_list.append(item_path)  # 这里收集文件路径


if __name__ == '__main__':
    path = "C:/Home/python/project/python_draft/tes_data2"
    
    # 非递归
    result_list2 = []
    list_files(path, result_list2)
    # print(result_list2)
    print(len(result_list2))    # 结果23913

使用列表实现:

def show_files_by_list(base_path, res_data_list):
    """
    遍历目录(使用列表实现)
    :param base_path: 要获取它下面所有文件的路径
    :param res_data_list: 收集结果的列表
    """
    path_list = list()  # 使用列表来存储目录路径
    path_list.append(base_path)
    while path_list:
        current_dir = path_list.pop()
        for item in os.listdir(current_dir):
            item_path = os.path.join(current_dir, item)
            if os.path.isdir(item_path):
                path_list.append(item_path)  # 将子目录添加到栈中
            else:
                res_data_list.append(item_path)


if __name__ == '__main__':

    path = "C:/Home/python/project/python_draft/tes_data2"

    # 列表实现
    result_list3 = []
    show_files_by_list(path, result_list3)
    # print(result_list2)
    print(len(result_list3))    # 结果23913

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值