Выведение структуры папки на python3 с помощью модуля os

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

Я только начинаю свой путь в питоне и возникла следующая ситуация: мне нужно вывести структуру(в виде дерева) указанной папки, переданной как аргумент, используя модуль os, отображать имя и размер каждого файла. Я уже два дня пытаюсь решить эту задачу. У меня есть два куска кода. Один выводит структуру папки, другой выводит размер файлов. И я бы хотел понять как выводить сразу и то и то. Надеюсь здесь мне кто то сможет показать как это сделать и по возможности объяснить как это работает. Примеры кода ниже. Заранее большое спасибо.

##Этот выводит структуру##

    import os
    directory = "C:\\Users/user/Desktop/Papka"
        for dirpach, dirnames, filenames, in os.walk(directory):
            for dirname in dirnames:
                print('Каталог: ', os.path.join(dirpach, dirname))
            for filename in filenames:
                print('Файл: ', os.path.join(dirpach, filename))

##Этот выводит размер##

    import os
    from os.path import join, getsize
    directory = "C:\\Users/user/Desktop/Papka"
    for root, dirs, files in os.walk(directory):
        print(root, "consumes", end=" ")
        print(sum(getsize(join(root, name)) for name in files), end=" ")
        print("bytes in", len(files), "non-directory files")

Ответы

▲ 0

Вариант рекурсивной функции для вывода файлового дерева с размерами файлов и каталогов с использованием модуля os

import os
from os.path import join, getsize, basename


def dfs_tree(path):
    def tree(path, level):
        dsize, files, dirs = 0, [], []
        files.append(f'{" " * (level - 1) * 4}\\{basename(path)}\\ ')
        for item in sorted(os.listdir(path), key=lambda x: os.path.isfile(join(path, x))):
            fullname = join(path, item)
            if os.path.isdir(fullname):
                tmp = tree(fullname, level + 1)
                dsize += tmp[0]
                files.append(tmp[1])
            else:
                fsz = getsize(fullname)
                files.append(f'{" " * level * 4}{item}  [{fsz:,} bytes]')
                dsize += fsz
        files[0] += f'[{dsize:,} bytes]'
        return dsize, '\n'.join(files)

    return tree(path, 1)[1]


print(dfs_tree('c:\\test'))
\test\ [7,456,345 bytes]
    \File path\ [16,798 bytes]
        PowerShell2.xlsm  [16,785 bytes]
        upload.ps1  [13 bytes]
    \folder\ [1,374,678 bytes]
        \archive\ [0 bytes]
        \audio\ [0 bytes]
        \documents\ [1,354,290 bytes]
            periodic-table.pdf  [1,330,344 bytes]
            TemplateVBA_0031.xlsx  [10,410 bytes]
            test111111.txt  [47 bytes]
            TESTDOC.docx  [13,029 bytes]
            Text_1.txt  [460 bytes]
        \images\ [0 bytes]
        \video\ [0 bytes]
        TESTDOC.docm  [20,388 bytes]
...