如何在python中创建用于存储目录结构的嵌套字典?

2024-05-16 14:08:45 发布

您现在位置:Python中文网/ 问答频道 /正文

假设以下目录结构:

|--apc
|   |--data
|   |   |--datainstaller.zip
|   |   |--rs_details
|   |   |   |--readme.txt
|   |--rem
|   |   |--15.0.x
|   |   |   |--15.0.1
|   |   |   |   |--dataconversion
|   |   |   |   |   |--details.txt
|   |   |   |--15.0.2
|   |   |   |   |--dataconversion
|   |   |   |   |   |--details.txt
|   |   |--alloc_details.txt
|   |--res
|   |   |--resapp.zip
|--REIM
|   |--dataconversion
|   |   |--dataconversioninstaller.zip
|   |   |--rs_details.txt
|   |--reim_bkp.zip
|   |--hotfix
|   |   |--mergedRC
|   |   |   |--alloc
|   |   |   |   |--p231.zip
|--testfile1.txt
|--testfile2.txt

以绝对路径(从根目录开始,以深度优先的方式)以python列表形式给出(即,路径在列表中以字符串形式给出):-

['apc/','apc/data/', 'apc/data/datainstaller.zip', 'apc/data/rs_details/', 'apc/data/rs_details/readme.txt', 'apc/rem/', 'apc/rem/15.0.x/', 'apc/rem/15.0.x/15.0.1/', 'apc/rem/15.0.x/15.0.1/dataconversion/', 'apc/rem/15.0.x/15.0.1/dataconversion/details.txt', 'apc/rem/15.0.x/15.0.2/', 'apc/rem/15.0.x/15.0.2/dataconversion/', 'apc/rem/15.0.x/15.0.2/dataconversion/details.txt', 'apc/rem/alloc_details.txt', 'apc/res/', 'apc/res/resapp.zip', 'REIM/', 'REIM/dataconversion/', 'REIM/dataconversion/dataconversioninstaller.zip', 'REIM/dataconversion/rs_details.txt', 'REIM/reim_bkp.zip', 'REIM/hotfix/', 'REIM/hotfix/mergedRC/', 'REIM/hotfix/mergedRC/alloc', 'REIM/hotfix/mergedRC/alloc/p231.zip', 'testfile1.txt', 'testfile2.txt']

我想创建一个嵌套字典来存储这个目录结构,它是这样的:-

  {
       'apc/': {

                'apc/data/':{
                             'apc/data/datainstaller.zip' : {}
                              'apc/data/rs_details/' : {
                                            'apc/data/rs_details/readme.txt' : {}
                                         }
                          
                'apc/rem/':{
                                'apc/rem/15.0.x' : {
                                                'apc/rem/15.0.x/15.0.1/': { 
                                                                             'apc/rem/15.0.x/15.0.1/dataconversion' : { 'apc/rem/15.0.x/15.0.1/dataconversion/details.txt' : {} }
                                         }
                                                'apc/rem/15.0.x/15.0.2/': { 
                                                                             'apc/rem/15.0.x/15.0.2/dataconversion' : { 'apc/rem/15.0.x/15.0.2/dataconversion/details.txt' : {} }
                                         }
                             }
                       }
             }
   }

我试图通过在路径中使用参数作为/的数量,并在较低级别的目录路径中查找前缀,以迭代方式和递归方式执行此操作,但这导致嵌套字典不一致,并且无法获得所需的字典,如上所示

有人能帮我解决这个问题吗

[编辑:目录的路径字符串始终以/结尾,而文件的路径字符串不以]


Tags: 路径目录txtdatazipdetailshotfixrs
1条回答
网友
1楼 · 发布于 2024-05-16 14:08:45

这可以做到:

import os, json

directory_dict = {}

path_list = ['apc/','apc/data/', 'apc/data/datainstaller.zip', 'apc/data/rs_details/', 'apc/data/rs_details/readme.txt', 'apc/rem/', 'apc/rem/15.0.x/', 'apc/rem/15.0.x/15.0.1/', 'apc/rem/15.0.x/15.0.1/dataconversion/', 'apc/rem/15.0.x/15.0.1/dataconversion/details.txt', 'apc/rem/15.0.x/15.0.2/', 'apc/rem/15.0.x/15.0.2/dataconversion/', 'apc/rem/15.0.x/15.0.2/dataconversion/details.txt', 'apc/rem/alloc_details.txt', 'apc/res/', 'apc/res/resapp.zip', 'REIM/', 'REIM/dataconversion/', 'REIM/dataconversion/dataconversioninstaller.zip', 'REIM/dataconversion/rs_details.txt', 'REIM/reim_bkp.zip', 'REIM/hotfix/', 'REIM/hotfix/mergedRC/', 'REIM/hotfix/mergedRC/alloc', 'REIM/hotfix/mergedRC/alloc/p231.zip', 'testfile1.txt', 'testfile2.txt']

for item in path_list:
    path, filename = os.path.split(item)
    split_path = path.split('/')
    # directory_level is a pointer into the directory_dict
    directory_level = directory_dict
    # current_directory is a string to hold the path name as we build it up again from iterating the split_path list
    current_directory = ''

    for path_item in split_path:
        # build up the current_directory
        current_directory += path_item + '/'
        if current_directory not in directory_level:
            # insert new dictionary at this level
            directory_level[current_directory] = {}
        # set the directory_level pointer to new level
        directory_level = directory_level[current_directory]

    if filename:
        # add the whole item into the dictionary at this level
        directory_level[item] = {}

print(json.dumps(directory_dict, indent=4)) 

以及输出:

{
    "apc/": {
        "apc/data/": {
            "apc/data/datainstaller.zip": {},
            "apc/data/rs_details/": {
                "apc/data/rs_details/readme.txt": {}
            }
        },
        "apc/rem/": {
            "apc/rem/15.0.x/": {
                "apc/rem/15.0.x/15.0.1/": {
                    "apc/rem/15.0.x/15.0.1/dataconversion/": {
                        "apc/rem/15.0.x/15.0.1/dataconversion/details.txt": {}
                    }
                },
                "apc/rem/15.0.x/15.0.2/": {
                    "apc/rem/15.0.x/15.0.2/dataconversion/": {
                        "apc/rem/15.0.x/15.0.2/dataconversion/details.txt": {}
                    }
                }
            },
            "apc/rem/alloc_details.txt": {}
        },
        "apc/res/": {
            "apc/res/resapp.zip": {}
        }
    },
    "REIM/": {
        "REIM/dataconversion/": {
            "REIM/dataconversion/dataconversioninstaller.zip": {},
            "REIM/dataconversion/rs_details.txt": {}
        },
        "REIM/reim_bkp.zip": {},
        "REIM/hotfix/": {
            "REIM/hotfix/mergedRC/": {
                "REIM/hotfix/mergedRC/alloc": {},
                "REIM/hotfix/mergedRC/alloc/": {
                    "REIM/hotfix/mergedRC/alloc/p231.zip": {}
                }
            }
        }
    },
    "/": {
        "testfile1.txt": {},
        "testfile2.txt": {}
    }
}

相关问题 更多 >