0

我有一个文件夹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_projectsis4其中包含第一层子文件夹:a, b, c, d; while num_buildingsis 11, 其中包含子目录: a1, a2, a3, b1, b2, b3, b4, c1, c2, c3 and d; 并且num_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是错误的。我怎样才能使它正确?谢谢。

4

2 回答 2

1

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))
于 2019-06-04T11:03:35.103 回答
1

您在这里有两个不同的问题:

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

如何使它正确?

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

问题 #2 ( num_buildings):

你的规格:

如果没有第二层子目录,则等于第一层子目录的个数,否则,计算第二层子目录。

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

如何使它正确?

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

于 2019-06-04T09:23:58.090 回答