我从这里得到部分答案Construct a tree from list os file paths (Python) - Performance dependent
我的具体问题要求我从
这个
dir/file 10
dir/dir2/file2 20
dir/dir2/file3 10
dir/file3 10
dir3/file4 10
dir3/file5 10
到
dir/ **50**
dir2/ **30**
file2
file3
file
file3
dir3/ **20**
file4
file5
基本上,最后的数字是文件大小和
我一直试图弄清楚如何将所有文件的大小显示到父目录
编辑:
r = re.compile(r'(.+\t)(\d+)')
def prettify(d, indent=0):
for key, value in d.iteritems():
ss = 0
if key == FILE_MARKER:
if value:
for each in value:
mm = r.match(each)
ss += int(mm.group(2))
print ' ' * indent + each
***print ' ' * indent + format_size(ss)***
else:
print ' ' * indent + str(key)
if isinstance(value, dict):
addSizes(value, indent+1)
else:
print ' ' * (indent+1) + str(value)
这是mac的答案来自我编辑使用regExp的上述链接 我遇到的解决方案让我创造了一个新的词典或增加了一个内在的功能 我已经失去了一整天,并希望我能在当天早些时候寻求帮助 请帮忙。
答案 0 :(得分:2)
这不是世界上最优雅的东西,但这应该可以让你到达你需要的地方。您需要更改树创建功能以处理您获得的任何形式的输入。生成树后,它只是使用递归树遍历来形成输出。
import re
input_dirs = """dir/file 10
dir/dir2/file2 20
dir/dir2/file3 10
dir/file 10
dir3/file4 10
dir3/file5 10
dir/dir2/dir4/file2 10"""
def create_file_tree(input_string):
dir_dict = {}
for file_path in input_string.split('\n'):
path_list = re.sub('/',' ',file_path).split()
path_list[-1] = int(path_list[-1])
path_dict = dir_dict
final_item = ""
for item in path_list[:-1]:
parent_dict = path_dict
last_item = item
path_dict = path_dict.setdefault(item,{})
parent_dict[last_item] = path_list[-1]
return dir_dict
def pretty_file_tree(file_tree):
def traverse(sub_dict,indent=0, total=0):
string_out = ""
indent += 1
for key in sorted(sub_dict.keys()):
if type(sub_dict[key]) == dict:
sub_total = traverse(sub_dict[key],indent,0)
total += sub_total[0]
string_out += ' '*indent + key + ' ' + '**' + str(sub_total[0]) + '**' + '\n' + sub_total[1]
else:
string_out += ' '*indent + key + '\n'
total += sub_dict[key]
return total, string_out
output_string = traverse(file_tree)
print(output_string[1])
pretty_file_tree(create_file_tree(input_dirs))
很抱歉,它没有关注你发布的代码,但我在编辑之前就开始制作了这个代码...
答案 1 :(得分:0)
在处理输入时,为数字创建一个带占位符(%d)的字符串,然后打印出字符串。