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

时间:2019-02-19 19:08:38

标签: python filesystems 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接受了root,dir,文件。 os.walk是否可以完全满足我的需要,而不必陷入3个for循环中?我打算计算很多文件,因此我想确保通过像我一样对文件进行结构化设置来对性能没有造成影响

2 个答案:

答案 0 :(得分:1)

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/上的几个示例)

答案 1 :(得分:0)

os.walk()不会在根,目录和文件中输入,但实际上会将它们吐出。 更准确地说,os.walk()为您提供了一个生成器,您可以对其进行循环并获取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)