python 統計指定文件夾下全部的文件數量,BFS方式

python 統計指定文件夾下全部的文件數量

原本一直是有這個需求,只是之前寫的是遞歸的方式處理,感受對資源的佔用不友好,並且python的最大遞歸深度不超過1000,因此改了一下,這裏用廣度優先遍歷的方式實現。
實測兩層共24個文件夾,共50w的文件數量。運行時間大概3秒。如下是代碼:python

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函數就能夠實現判斷對文件名的各類判斷操做,這裏函數功能的實現就徹底取決於本身的腦洞了!code

附上一個改編版: 查看包含特定後綴的文件的數量遞歸

改編版: 查看包含特定後綴的文件的數量

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}')
相關文章
相關標籤/搜索