资讯专栏INFORMATION COLUMN

python 统计指定文件夹下所有的文件数量,BFS方式

KavenFan / 2307人阅读

摘要:统计指定文件夹下所有的文件数量本来一直是有这个需求,只是以前写的是递归的方式处理,感觉对资源的占用不友好,而且的最大递归深度不超过,所以改了一下,这里用广度优先遍历的方式实现。实测两层共个文件夹,共的文件数量。

python 统计指定文件夹下所有的文件数量

本来一直是有这个需求,只是以前写的是递归的方式处理,感觉对资源的占用不友好,而且python的最大递归深度不超过1000,所以改了一下,这里用广度优先遍历的方式实现。
实测两层共24个文件夹,共50w的文件数量。运行时间大概3秒。以下是代码:

import os
import queue

def get_file_quantity(folder: str) -> int:
    """BFS获取文件夹下文件的总数量"""
    # 判断初始文件夹
    assert os.path.isdir(folder), "请输入有效的文件夹参数"
    file_quantity = 0                       # 初始化文件数量
    folder_path_queue = queue.Queue()
    folder_path_queue.put_nowait(folder)    # 初始化队列的值
    # 处理队列里的文件夹
    while not folder_path_queue.empty():
        folder = folder_path_queue.get_nowait()
        file_folder_list = list(map(lambda bar: os.path.join(folder, bar), os.listdir(folder)))
        folder_list = list(filter(lambda bar: os.path.isdir(bar), file_folder_list))
        for folder_path in folder_list:
            folder_path_queue.put_nowait(folder_path)
        temp_file_count = len(file_folder_list) - len(folder_list)
        file_quantity += temp_file_count
    return file_quantity
    
if __name__ == "__main__":
    file_quantity = get_file_quantity(r"/home")
    print(f"文件总数是: {file_quantity}")
思路

这里主要是使用了队列,就是普通的BFS的思路

这里稍微改一下folder_list = list(filter(lambda bar: os.path.isdir(bar), file_folder_list))里的的lambda函数就可以实现判断对文件名的各种判断操作,这里函数功能的实现就完全取决于自己的脑洞了!

附上一个改编版: 查看包含特定后缀的文件的数量

改编版: 查看包含特定后缀的文件的数量
import os
import queue

def filter_extension(filename: str, extension: str) -> bool:
    """判断文件路径名的后缀是否和给定的后缀字符串相同
    只是单纯的字符串判断
    """
    basename_and_extension = filename.split(".")
    return (basename_and_extension[-1] == extension) and (len(basename_and_extension) >= 2)

def get_file_quantity(folder: str, extension: str) -> int:
    """BFS获取文件夹下文件的总数量"""
    # 判断初始文件夹
    assert os.path.isdir(folder), "请输入有效的文件夹参数"
    assert isinstance(extension, str), "请输入有效的文件后缀名"
    file_quantity = 0                       # 初始化文件数量
    folder_path_queue = queue.Queue()
    folder_path_queue.put_nowait(folder)    # 初始化队列的值
    # 处理队列里的文件夹
    while not folder_path_queue.empty():
        folder = folder_path_queue.get_nowait()
        file_folder_list = list(map(lambda bar: os.path.join(folder, bar), os.listdir(folder)))
        folder_list = list(filter(lambda bar: os.path.isdir(bar), file_folder_list))
        file_list = list(filter(lambda bar: os.path.isfile(bar), file_folder_list))
        match_extension_list = list(filter(lambda bar: filter_extension(bar, extension), file_list))
        for folder_path in folder_list:
            folder_path_queue.put_nowait(folder_path)
        temp_file_count = len(match_extension_list)
        file_quantity += temp_file_count
    return file_quantity
if __name__ == "__main__":
    extension = "py"
    file_quantity = get_file_quantity(r"/home", extension)
    print(f"包含后缀 {extension } 的文件的数量: {file_quantity}")

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43744.html

相关文章

  • 自制小工具大大加速MySQL SQL语句优化(附源码)

    摘要:如果语句中使用了子查询集合操作临时表等情况,会给列带来很大的复杂性。会递归执行这些子查询,把结果放在临时表里。查询优化器从中所选择使用的索引。该字段显示了查询优化器通过系统收集的统计信息估算出来的结果集记录条数。 引言 优化SQL,是DBA常见的工作之一。如何高效、快速地优化一条语句,是每个DBA经常要面对的一个问题。在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤。然...

    Hujiawei 评论0 收藏0
  • PHP面试:常见查找算法一篇说透

    摘要:我们现在来看二分搜索算法的两种变形插值搜索和指数搜索。插值搜索是对二分搜索算法的改进,插值搜索可以基于搜索的值选择到达不同的位置。 预警 在本篇文章中,将为各位老铁介绍不同的搜索算法以及它们的复杂度。因为力求通俗易懂,所以篇幅可能较长,大伙可以先Mark下来,每天抽时间看一点理解一点。本文配套的Github Repo,欢迎各位老铁star,会一直更新的。 开篇 和排序类似,搜索或者叫做...

    付永刚 评论0 收藏0
  • Python脚本制作获得fasta文件单编码序列信息内容完成

      这篇文章主要为大家介绍了Python脚本提取fasta文件单序列信息实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪  此篇文章关键给大家介绍了Python脚本制作获得fasta文件单编码序列信息内容完成实例,感兴趣的小伙伴可以参考借鉴一下,希望可以有一定的帮助,祝愿大家多多的发展,尽早涨薪  Python脚本制作编写  应用Python对fasta格式编码...

    89542767 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<