统计 Python 中有特殊情况的子目录和文件的数量

Count numbers of subdirectories and files with special conditions in Python

我有一个文件夹 test,我想从中按以下规则计算 projectsbuildingstxt_files 的数量。

对于projects的个数,就等于第一层子目录的子文件夹个数。 buildings的个数,如果没有第二层子目录,就等于第一层子目录的个数,否则,算第二层子目录。

├─a
│  ├─a1
│  ├─a2
│  └─a3
│      ├─a3_1.txt
│      ├─a3_2.geojson
│      └─a3_3.txt
├─b
│  ├─b1
│  ├─b2
│  ├─b3
│  └─b4
├─c
│  ├─c1
│  ├─c2
│  └─c3
├─d
└─123.txt

对于以下示例结构:num_projects4,其中包含第一层子文件夹:a, b, c, d;而 num_buildings11,其中包含子目录:a1, a2, a3, b1, b2, b3, b4, c1, c2, c3 and dnum_txt3.

目前我的解决方案:

import os

path = os.getcwd()

num_projects = 0 
num_buildings = 0 
num_txt = 0 

for subdirs in os.listdir(path):
    num_projects += 1    

for root, dirnames, filenames in os.walk(path):
    for dirname in dirnames:
        num_buildings += 1
    for filename in filenames:
        if filename[-4:] == ".txt":
            num_txt += 1

print("Number of projects is %d, number of buildings is %d, number of txt files is %d." %(num_projects, num_buildings, num_txt))   

输出:

Number of projects is 5, number of buildings is 17, number of txt files is 3.

num_projectsnum_buildings是错误的。我怎样才能使它正确?谢谢。

这里有两个不同的问题:

问题 #1 (num_projects):os.listdir() 列出路径中的所有条目 - 不仅是目录。

How to make it correct?

嗯,很简单,在增加计数器之前测试条目是文件还是目录。

问题 #2 (num_buildings):

您的规格:

it equals to the numbers of the first layer of subdirectories if it does not have the second layer of subdirectories, otherwise, count the second layer of subdirectories.

实际上根本没有在您的代码中实现 - 您只计算所有目录和子目录。

How to make it correct?

尝试实现规范可能是一个很好的起点...请注意,os.walk() 可能不是这里的最佳解决方案。

os.walk() 是一个生成器,应该能够处理许多目录(和子目录)而不用担心内存。

这不是很优雅,但试试这个:

import os

projects = 0
buildings = 0
txt_files = 0

path = os.getcwd()

for root, directories, files in os.walk(path):
    if root == path:
        projects = len(directories)
        for sub_dir in directories:
            full_dir = os.path.join(root, sub_dir)
            for root_, directories_, files_ in os.walk(full_dir):
                if root_ == full_dir:
                    if directories_ == []:
                        buildings += 1
                    else:
                        buildings += (len(directories_))

    for i in files:
        if i.endswith('.txt'):
            txt_files += 1

print("There are {} projects, {} buildings and {} text files".format(projects, buildings, txt_files))