【问题标题】:Os.walk - count files in same subdirectory of parent directoriesOs.walk - 计算父目录相同子目录中的文件
【发布时间】:2019-02-22 18:32:03
【问题描述】:

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

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 循环吗?我打算计算很多文件,所以我想确保我不会像我一样构建它来影响性能

【问题讨论】:

  • 嗨,大卫,如果其中一个回答回答了您的问题,请接受它

标签: python filesystems os.walk


【解决方案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("*"))

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

【讨论】:

    【解决方案2】:

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

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

    os.walk() 会自动从 TOP_FOLDER 开始向下移动到您的文件夹树中。 我不确定您为什么要执行 3 个 for 循环。除非我误解了您的需求,否则以下应该计算 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-10
      • 1970-01-01
      • 2015-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 2016-05-16
      相关资源
      最近更新 更多