首页 > 解决方案 > 如何存储绝对路径并将它们显示为python中的目录结构?

问题描述

我得到了一个列表中的绝对目录路径列表:-

 [ ['19.2.000/'],['19.2.000/data/'],
 ['19.2.000/data/datainstaller.zip'], ['19.2.000/data/rs_details'],
 ['19.2.000/rem/'],
 ['19.2.000/rem/remapp.zip'], ['19.2.000/rem/rs_details'],
 ['19.2.000/res/'], ['19.2.000/res/resapp.zip'], ['19.2.000/rms/'],
 ['19.2.000/rms/BdiEdge.zip'], ['19.2.001/'],
 ['19.2.001/dataconversion/'],
 ['19.2.001/dataconversion/dataconversioninstaller.zip'],
 ['19.2.001/dataconversion/rs_details'] ]

我想将目录结构显示为:-

|--19.2.000
|   |--data
|   |   |--datainstaller.zip
|   |   |--rs_details
|   |--rem
|   |   |--remapp.zip
|   |   |--rs_details
|   |--res
|   |   |--resapp.zip
|   |--rms
|   |   |--BdiEdge.zip
|--19.2.001
|   |--dataconversion
|   |   |--dataconversioninstaller.zip
|   |   |--rs_details

我尝试使用嵌套的 for 循环(通过将每个级别存储在不同的列表中)来做到这一点,但是随着目录级别的增加,它变得多余且缓慢。任何其他方式来优化显示它?

标签: pythonlistdirectorypath

解决方案


我首先对列表进行排序 - 然后它们至少按照您想要的顺序排列。这被推断为基于 num '/' 的缩进使用 vars 以及使用 '/' 上的拆分索引。

老实说,这个问题引起了我的兴趣,所以这里的版本应该与您作为列表提供的任何 dir 结构一起使用,即使某些子文件夹没有列出。

def make_fldr(arr):
    print("-- Processing Pass 1 --")
    processed = []
    path_repr = ''
    sub_dir = '|  '
    for path in arr:
        dirs = path[0].split("/")
        num_slash = path[0].count('/')
        sep = '/'
        for i in range(num_slash):
            rep = sep.join(dirs[:i+1])
            if [rep+'/'] not in arr:
                arr.append([rep+'/'])
    [processed.append(x) for x in arr if x not in processed] 
    print("-- Building structure: Pass 2 --")
    processed.sort()
    print("Processed List is sorted")
    for path in processed:
        num_slash = path[0].count('/')
        if num_slash == 1:
            piece = path[0].split("/")
            if piece[1] == '':
                path_repr += f'|--{piece[0]}\n'
            else:
                path_repr += f'{sub_dir}|--{piece[1]}\n'
        else:
            if path[0].split("/")[-1] == '':
                path_repr += f'{sub_dir * (num_slash-1)}|--{path[0].split("/")[-2]}\n'
            else:
                path_repr += f'{sub_dir * num_slash}|--{path[0].split("/")[-1]}\n'
    return path_repr


structure = make_fldr(data)
print(structure)

给定一个扩展集

data = [
        ['19.2.000/'],
        ['19.2.000/resa/'],
        ['19.2.000/resa/resa19application.zip'],
        ['19.2.000/rms/'],
        ['19.2.000/rms/BdiEdgeAppJobAdminPak19.1.000ForRms19.1.000_eng_ga.zip'],
        ['19.2.001/'],
        ['19.2/'],
        ['19.2/rpm/'],
        ['19.2/rpm/release_details'],
        ['19.2/rpm/rpm19application.zip'],
        ['RESA/'],
        ['RESA/folder1/'],
        ['RESA/folder1/release_details'],
        ['RESA/folder1/resainstaller.zip'],
        ['RESA/release_details'],
        ['RESA/resainstaller.zip'],
        ['RMS/'],
        ['RMS/release_details'],
        ['RMS/rmsinstaller.zip'],
        ['RPM/'],
        ['RPM/release_details'],
        ['RPM/rpminstaller.zip']
        ]

上面的函数产生

Processed List is sorted
|--19.2.000
|  |--resa
|  |  |--resa19application.zip
|  |--rms
|  |  |--BdiEdgeAppJobAdminPak19.1.000ForRms19.1.000_eng_ga.zip
|--19.2.001
|--19.2
|  |--rpm
|  |  |--release_details
|  |  |--rpm19application.zip
|--RESA
|  |--folder1
|  |  |--release_details
|  |  |--resainstaller.zip
|  |--release_details
|  |--resainstaller.zip
|--RMS
|  |--release_details
|  |--rmsinstaller.zip
|--RPM
|  |--release_details
|  |--rpminstaller.zip

我用你分享的完整文件进行了测试——它似乎工作正常。早期版本不起作用的原因是我假设所有子目录都以'/'结尾,但有些没有。一旦我用完整的集合进行测试,我就可以找出错误发生的位置。


推荐阅读