python - 如何在python中存储绝对路径并将其显示为目录结构?

标签 python list directory path

我得到了一个列表中的绝对目录路径列表,如下所示:-

 [ ['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 循环(通过将每个级别存储在不同的列表中)来完成此操作,但随着目录级别的增加,它变得多余且缓慢。还有其他方式可以最佳地显示它吗?

最佳答案

我首先对列表进行排序 - 然后它们至少按照您想要的顺序排列。这是根据 num '/' 以及使用 '/' 上的分割索引使用 var 来推断的。

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

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

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

关于python - 如何在python中存储绝对路径并将其显示为目录结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66355946/

相关文章:

python - 如果键在列表中,如何更新嵌套字典中的值?

python - 用户排名 - Django

c - 如何在给定目录中查找特定文件并检查它是文件还是另一个目录

windows - 从特定文件夹中获取特定文件

python - Python 中是否有相当于 Unix 中 vfork 的工具?

python - tensorflow 中的 var.op.name 和 var.name 有什么区别?

python - 我想将元组值添加到元组,如果该元组[0 :2] is repeated as shown below:

python - Python 中多个项目的列表按值排序

c - 将节点插入 Dllist

algorithm - 查找目录的大小