Os.walk - 计算父目录的同一子目录中的文件



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

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接收根,目录,文件。os.walk 可以完全满足我的需求而不进入 3 个 for 循环吗?我打算计算很多文件,所以我想确保我不会通过像我一样构建它来影响性能

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_folder(使用问题中的文件结构):

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

(第二个代码片段改编自几个示例:https://realpython.com/python-pathlib/)

os.walk() 不接收 root、dir和 file,但实际上将它们吐出来。 更准确地说,os.walk() 为您提供了一个生成器,您可以循环并获取 3 元组(根、目录、文件)。您可以使用 3 元组,也可以使用以下格式直接解压缩:

for roots, dirs, files in os.walk(TOP_FOLDER):
...

os.walk() 从 TOP_FOLDER 开始自动向下移动到您的文件夹树中。 我不确定你为什么要做 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)