统计 Python 中有特殊情况的子目录和文件的数量
Count numbers of subdirectories and files with special conditions in Python
我有一个文件夹 test
,我想从中按以下规则计算 projects
、buildings
和 txt_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_projects
是4
,其中包含第一层子文件夹:a, b, c, d
;而 num_buildings
是 11
,其中包含子目录:a1, a2, a3, b1, b2, b3, b4, c1, c2, c3 and d
; num_txt
是 3
.
目前我的解决方案:
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_projects
和num_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))
我有一个文件夹 test
,我想从中按以下规则计算 projects
、buildings
和 txt_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_projects
是4
,其中包含第一层子文件夹:a, b, c, d
;而 num_buildings
是 11
,其中包含子目录:a1, a2, a3, b1, b2, b3, b4, c1, c2, c3 and d
; num_txt
是 3
.
目前我的解决方案:
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_projects
和num_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))