使用嵌套字典和格式显示

时间:2013-08-07 14:32:55

标签: python dictionary

我从这里得到部分答案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的上述链接 我遇到的解决方案让我创造了一个新的词典或增加了一个内在的功能 我已经失去了一整天,并希望我能在当天早些时候寻求帮助 请帮忙。

2 个答案:

答案 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)的字符串,然后打印出字符串。