【问题标题】:How to store absolute paths and display them as a directory structure in python?如何存储绝对路径并将它们显示为python中的目录结构?
【发布时间】:2021-05-27 01:42:12
【问题描述】:

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

 [ ['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 循环(通过将每个级别存储在不同的列表中)来做到这一点,但是随着目录级别的增加,它变得多余且缓慢。有什么其他方式可以优化显示吗?

【问题讨论】:

    标签: python list directory path


    【解决方案1】:

    我会先对列表进行排序 - 然后它们至少按照您想要的顺序排列。这被推断为基于 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
    

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

    【讨论】:

    • 您的方法适用于大多数情况,但不适用于某些情况。检查这个link
    • 我已经修改了删除重复项的功能 - 我在那里有一个“已处理”列表,然后似乎不需要它......但我没有检查比原来更多的案例放。如果现在可以满足您的要求,您能否告诉我@ShetuRaj?谢谢。我喜欢在这方面工作。
    • 仍有一些情况不起作用。我在链接中提到的那些仍然给出相同的输出。无论如何感谢您的回答!
    • 你能给我看看给出的列表吗?我无法让它复制您在图像中显示的内容。谢谢。
    • 这里是整个list
    猜你喜欢
    • 2016-12-25
    • 2014-11-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2017-09-15
    • 2012-02-10
    • 1970-01-01
    • 2018-12-23
    相关资源
    最近更新 更多