Подсчитать количество подкаталогов и файлов с особыми условиями в Python - PullRequest
0 голосов
/ 04 июня 2019

У меня есть папка 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 неверны. Как я могу сделать это правильно? Спасибо.

Ответы [ 2 ]

1 голос
/ 04 июня 2019

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))
1 голос
/ 04 июня 2019

У вас есть две различные проблемы здесь:

Выпуск № 1 (num_projects): os.listdir() список ВСЕХ записей в пути - не только каталогов.

Как сделать это правильно?

Что ж, достаточно просто проверить, является ли запись файлом или каталогом, прежде чем увеличивать счетчик.

Выпуски № 2 (num_buildings):

ваша спецификация:

равняется номерам первого уровня подкаталогов, если у него нет второго уровня подкаталогов, в противном случае подсчитывается второй уровень подкаталогов.

на самом деле НЕ реализован ВСЕ в вашем коде - вы просто считаете все каталоги и подкаталоги.

Как сделать это правильно?

Попытка реализовать спецификации может быть хорошей отправной точкой ... Обратите внимание, что os.walk() может быть не лучшим решением здесь.

...