Ошибка в выводе результатов рекурсивной функции (Обход всех подкаталогов и файлов в каталоге - Python)

Рейтинг: 0Ответов: 1Опубликовано: 28.07.2023

Подскажите пожалуйста! Необходимо написать функцию, которая получает на вход путь до каталога (причем, это может быть и корень диска) и выводит количество файлов и подкаталогов в нём. Также необходимо дополнительно вывести размер каталога в Кб.

Код программы:

import os


def catalog_search(catalog, dirs_catalog=0, files_count=0, file_sum=0):
    """Выводит кол-во подкаталогов, файлов и размер каталога (Кб)"""
    for catalog_element in os.listdir(catalog):
        if os.path.isdir(catalog + "\\" + catalog_element):
            dirs_catalog += 1
            catalog_search(catalog + "\\" + catalog_element)
        elif os.path.isfile(catalog + "\\" + catalog_element):
            files_count += 1
            file_stat = os.stat(catalog + "\\" + catalog_element)
            file_sum += file_stat.st_size
    return dirs_catalog, files_count, file_sum

path_catalog = "C:\\Users\\Example_catalog\\Module14"

catalogs, files, files_size = catalog_search(path_catalog)
print("Размер каталога (в Кб):", files_size / 1024)
print("Количество подкаталогов:", catalogs)
print("Количество файлов:", files)

В примере path_catalog в каталоге Module14 имеется 6 папок, причем каждая папка имеет минимум по 3 файла.

У меня ошибка в выводе количества файлов, так как программа выводит количество файлов только в каталоге, но при этом не считает файлы подкаталогов и не добавляет их в общее количество. В чем причина такого вывода до сих пор не могу понять.

Ответы

▲ 0

Я вот так решил. Программа работает - выводит количество файлов и подкаталогов в нём а также размер каталога в Кб.

import os

def file_sizes(path):
files_stat = [0,0,0]

for i_elem in os.listdir(path):
    if os.path.isfile(os.path.abspath(os.path.join(path,i_elem))):
         file_path = os.path.abspath(os.path.join(path,i_elem))
         file_size = os.path.getsize(file_path)
         files_stat[0] += file_size
         files_stat[1] += 1

    else:
        result = file_sizes(os.path.abspath(os.path.join(path,i_elem)))
        files_stat[0] += result[0]
        files_stat[1] += result[1]
        files_stat[2] += 1
return files_stat

path = os.path.abspath(os.path.join('..','..','Module20'))

result = file_sizes(path)
print('Размер каталога (в Кб):',result[0]/1024)
print('Количество файлов:',result[1])
print('Количество подкаталогов:',result[2])