【问题标题】:Python recursive function that prints filesystem hierachy打印文件系统层次结构的 Python 递归函数
【发布时间】:2022-01-10 18:53:25
【问题描述】:

我想编写一个递归函数,它可以根据层次结构内的深度级别漂亮地打印带有一些缩进的文件层次结构。对于打印的每个项目,我也想显示它的大小(如果文件是一个目录,它还应该打印它下面的项目的总大小)。例如,给出如下文件结构:

Folder1
   File.txt (30kb)
   SubFolder1
      image.jpg (300kb)
      dummy.c (100kb)

当从 Folder1 的路径开始运行函数时,我的程序应该打印如下内容:

Folder1 - size: 4096; total_size: 442288
\t File.txt - size: 30000;
\t SubFolder1 - size: 4096; total_size: 408192
\t \t image.jpg - size: 300000;
\t \t dummy.c - size: 100000;

我的方法是使用普通的 dfs 并按访问顺序打印节点,但我很快发现这行不通,因为在文件夹的情况下,我必须首先计算其子节点的大小,这意味着访问它们第一,打破打印顺序。

我的解决方案是存储 dfs 发现的每个文件/文件夹的相关信息,然后使用第二个函数根据该信息进行打印。

import os

def du(path):
    v = []
    dfs(path, 0, v)
    for entry in v:
        s = '\t' * entry[0]
        s += '{} - du: {}; total_du: {}\n'.format(entry[1], entry[2], entry[3])
        print(s)

def dfs(root='.', depth=0, v=[]):
    root_du = os.path.getsize(root)
    root_total_du = root_du
    v.append([depth, root, root_du, root_total_du])
    i = len(v) - 1

    for entry in os.listdir(root):
        entry_path = os.path.join(root, entry)
        entry_du = os.path.getsize(entry_path)
        entry_total_du = 0
        v.append([depth + 1, entry, entry_du, entry_total_du])
        j = len(v) - 1

        if os.path.isdir(entry_path):
            entry_total_du += dfs(entry_path, depth + 1, v)
            v[j][3] = entry_total_du
            root_total_du += entry_total_du
        else:
            root_total_du += entry_du

    v[i][3] = root_total_du
    return root_total_du

我的问题是是否有更有效的方法来执行此操作,可能不使用额外的列表或第二次遍历。

【问题讨论】:

标签: python algorithm depth-first-search


【解决方案1】:

考虑到问题的性质,我认为如果不将其分成两次传递是不可能的

  • 计算每个文件夹的大小需要像后序遍历这样的东西,您首先访问每个子级,然后将总数返回给父级

  • 以您想要的方式从上到下打印文件夹可能会使用预订遍历,您首先打印出父文件夹,然后是每个子文件夹

我想说的是,这两个条件是解决问题所必须满足的最低要求,并且因为使用一次遍历不可能同时满足这两个条件,所以没有不满足的解决方案涉及执行至少第二次遍历。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2013-11-22
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    相关资源
    最近更新 更多