0

我从这里得到了部分答案Construct a tree from list os file paths (Python) - Performance取决于

我的具体问题需要我从

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
解决方案让我创建了一个新的 dict 或添加了一个内部函数。
我已经失去了一整天,希望我能在当天早些时候寻求帮助。
请帮忙。

4

2 回答 2

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))

抱歉,它没有遵循您发布的代码,但我在编辑之前就开始制作了...

于 2013-08-07T18:00:24.920 回答
0

在处理输入时,为数字构建一个带有占位符 (%d) 的字符串,然后打印出该字符串。

于 2013-08-07T15:28:33.103 回答