从列表os文件路径构建树(Python) - 依赖于性能

cwo*_*ker 13 python tree recursion path

嘿,我正在研究一个用python编写的高性能文件管理/分析工具包.我想创建一个函数,以树格式给我一个列表或类似的东西.像这个问题(java相关)

从:

dir/file
dir/dir2/file2
dir/file3
dir3/file4
dir3/file5
Run Code Online (Sandbox Code Playgroud)

注意:路径列表未排序

至:

dir/
    file
    dir2/
        file2
    file3
dir3/
    file4
    file5

[[dir, [file, [dir2, [file2]], file3]], [dir3, [file4, file5]]]
Run Code Online (Sandbox Code Playgroud)

这些方面的东西.我一直在玩一些想法,但没有一个提供我想要的速度.

注意:我已经有了路径列表,所以不用担心.该函数采用路径列表并给出树列表.

提前致谢

mac*_*mac 16

既然你已经澄清了这个问题,我想以下是你想要的:

from collections import defaultdict

input_ = '''dir/file
dir/dir2/file2
dir/file3
dir2/alpha/beta/gamma/delta
dir2/alpha/beta/gamma/delta/
dir3/file4
dir3/file5'''

FILE_MARKER = '<files>'

def attach(branch, trunk):
    '''
    Insert a branch of directories on its trunk.
    '''
    parts = branch.split('/', 1)
    if len(parts) == 1:  # branch is a file
        trunk[FILE_MARKER].append(parts[0])
    else:
        node, others = parts
        if node not in trunk:
            trunk[node] = defaultdict(dict, ((FILE_MARKER, []),))
        attach(others, trunk[node])

def prettify(d, indent=0):
    '''
    Print the file tree structure with proper indentation.
    '''
    for key, value in d.iteritems():
        if key == FILE_MARKER:
            if value:
                print '  ' * indent + str(value)
        else:
            print '  ' * indent + str(key)
            if isinstance(value, dict):
                prettify(value, indent+1)
            else:
                print '  ' * (indent+1) + str(value)



main_dict = defaultdict(dict, ((FILE_MARKER, []),))
for line in input_.split('\n'):
    attach(line, main_dict)

prettify(main_dict)
Run Code Online (Sandbox Code Playgroud)

它输出:

dir3
  ['file4', 'file5']
dir2
  alpha
    beta
      gamma
        ['delta']
        delta
          ['']
dir
  dir2
    ['file2']
  ['file', 'file3']
Run Code Online (Sandbox Code Playgroud)

有几点需要注意:

  • 该脚本大量使用defaultdicts,基本上这允许跳过检查密钥的存在及其初始化(如果它不存在)
  • 目录名称被映射到字典键,我认为这对您来说可能是一个很好的功能,因为密钥是经过哈希处理的,并且您可以比使用列表更快地检索信息.您可以访问表单中的层次结构main_dict['dir2']['alpha']['beta']...
  • 注意之间的差异.../delta.../delta/.我认为这有助于您快速区分您的叶子作为目录或文件.

我希望这回答了你的问题.如果有任何不清楚的地方,发表评论.