Python Os.walk-在父目录的同一子目录中计数文件

Python Os.walk-在父目录的同一子目录中计数文件,python,filesystems,os.walk,Python,Filesystems,Os.walk,我试图计算一个特定文件夹中的文件数,包括大量的父目录。每个项目都包含相同的文件夹结构: C:/Projects 2019 Project A Communication Images Project B Communication Images ... 2018 ... 下面是我的尝试 base_dir

我试图计算一个特定文件夹中的文件数,包括大量的父目录。每个项目都包含相同的文件夹结构:

C:/Projects
    2019
        Project A
            Communication
                Images
        Project B
            Communication
                Images
        ...
    2018
        ...
下面是我的尝试

base_dir = 'C:/Projects/'
years = ['2019', '2018', '2017']
image_folder = '/Communication/Images'

project_list = []
for project in project_list:
    for year in years:
        target_folder = base_dir + year + project + image_folder
        for root, dirs, files in os.walk(folder):
            total += len(files)

# Print to CSV etc
首先,我需要得到一个指向图像文件夹的所有路径的列表。我正在努力理解(甚至尝试工作)os.walk包含root、dir和文件。os.walk是否可以准确地执行我需要的操作,而无需进入可能的3个for循环?我打算统计的文件很多,因此我想确保我不会像对待操作系统那样对性能造成影响。walk()不会将放入根目录、目录和文件,而是将它们吐出。 更准确地说,它为您提供了一个生成器,您可以在该生成器上循环并获得一个3元组(根、目录、文件)。您可以使用3元组,也可以直接使用以下格式将其解压缩:

for roots, dirs, files in os.walk(TOP_FOLDER):
    ...
os.walk()会自动向下移动到文件夹树中,从最上面的文件夹开始。 我不确定你为什么要做3个循环。除非我误解了您的需要,否则以下内容应该包括base_dir中的所有文件

base_dir = 'C:/Projects/'
tot = 0
for root, dirs, files in os.walk(base_dir):
    tot += len(files)
实际上,如果不需要跟踪文件夹和子文件夹路径,可以抑制解包元组的前两个元素:

    for _, _, files in os.walk(base_dir):
        tot += len(files)

Python3的
pathlib
对于这类东西来说非常灵活:

from pathlib import Path 

base_dir = Path('C:/Projects/')

# rglob = recursive glob; finds all files in all subdirectories
files_generator = base_dir.rglob("*")    

total_n_files = len(list(files_generator))
您甚至可以通过
target\u folder
(使用您问题中的文件结构)获得包含文件计数的字典,方法是:


(第二段代码片段改编自以下几个示例:)

Hi David,如果其中一个回答回答了您的问题,请接受
from collections import Counter

base_dir = Path('C:/Projects/')
file_counts = Counter(p.parent for p in base_dir.rglob("*"))