【发布时间】: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
我的问题是是否有更有效的方法来执行此操作,可能不使用额外的列表或第二次遍历。
【问题讨论】:
-
Calculating a directory's size using Python? 会回答您的问题吗? - 有答案显示如何获取目录中所有内容的总大小on-the-fly。
-
@wwii 好吧,这肯定有帮助,但我正在寻找自己的解决方案,以便我可以在此过程中练习一些算法:)
标签: python algorithm depth-first-search