将文件路径列表转换为类似于 json 文件的嵌套字典

考蒂利亚·纳鲁博卢

我已经尝试了几种在堆栈溢出时找到的解决方案,但是当从字典移动到文件列表时,我要么在分支的末尾得到空字典,要么以文件标记结束。

问题:一个python列表对象

paths =[/etc/bluetooth/rfcomm.conf.dpkg-remove
/etc/bluetooth/serial.conf.dpkg-remove
/etc/bluetooth/input.conf
/etc/bluetooth/audio.conf.dpkg-remove
/etc/bluetooth/network.conf
/etc/bluetooth/main.conf
/etc/fish
/etc/fish/completions
/etc/fish/completions/task.fish]

expected output:
{"etc" : 
    {"bluetooth" : 
        ["rfcomm.conf.dpkg-remove",
         "serial.conf.dpkg-remove",
         "input.conf",
         "audio.conf.dpkg-remove",
         "network.conf",
         "main.conf"],
     "fish" : 
        {"completions" : "task.fish"}}}

我发现我可以使用以下方法在 javascript 中输出:Parse string of file path to json object

有没有办法使用 dafaultdict 创建没有任何前面文本的叶子列表?

这让我最接近我正在寻找的东西,但我在每个节点上都留下了文件标记(defaultdict(dict,((FILE_MARKER,[]),)))。

from collections import defaultdict


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])
达里尔

代码

from pprint import pprint as pp # For pretty printing nested dictioanry

def make_path(paths):
    # Sort so deepest paths are first
    paths = sorted(paths, key = lambda s: len(s.lstrip('/').split('/')), reverse = True)

    tree_path = {}
    for path in paths:
        # Split into list and remove leading '/' if present
        levels = path.lstrip('/').split("/")
        
        file = levels.pop()
        acc = tree_path
        for i, p in enumerate(levels, start = 1):
            if i == len(levels):
                # Reached termination of a path
                # Use current terminal object is present, else use list
                acc[p] = acc[p] if p in acc else []
                if isinstance(acc[p], list):
                    # Only append if we are at a list
                    acc[p].append(file)
            else:
                # Exaand with dictionary by default
                acc.setdefault(p, {})
            acc = acc[p]

    return tree_path

用法

示例 1

paths =['/etc/bluetooth/rfcomm.conf.dpkg-remove',
        '/etc/bluetooth/serial.conf.dpkg-remove',
        '/etc/bluetooth/input.conf',
        '/etc/bluetooth/audio.conf.dpkg-remove',
        '/etc/bluetooth/network.conf',
        '/etc/bluetooth/main.conf',
        '/etc/fish',
        '/etc/fish/completions',
        '/etc/fish/completions/task.fish']

res = make_path(paths)
pp(res)  # Pretty print result

输出

{'etc': {'bluetooth': ['rfcomm.conf.dpkg-remove',
                       'serial.conf.dpkg-remove',
                       'input.conf',
                       'audio.conf.dpkg-remove',
                       'network.conf',
                       'main.conf'],
         'fish': {'completions': ['task.fish']}}}

示例 2

paths = [
  "path1/subpath1/file111.doc",
  "path1/subpath1/file112.doc",
  "path1/subpath2/file121.doc",
  "path1/subpath2/file122.doc",
  "path2/subpath1/file211.doc",
  "path2/subpath1/file212.doc",
  "path2/subpath2/file221.doc",
  "path2/subpath2/file222.doc",
  "path2/additionalpath3/additionalpath1/file2311.doc"
]
res = make_path(paths)
pp(res)  # Pretty print result

输出

{'path1': {'subpath1': ['file111.doc', 'file112.doc'],
           'subpath2': ['file121.doc', 'file122.doc']},
 'path2': {'additionalpath3': {'additionalpath1': ['file2311.doc']},
           'subpath1': ['file211.doc', 'file212.doc'],
           'subpath2': ['file221.doc', 'file222.doc']}}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将具有绝对文件路径的字典转换为类似于文件夹结构的嵌套Dict?

从python文件访问json中的嵌套字典

python:将嵌套字典转换为类似JSON的格式

将一列带有嵌套字典的json文件转换为Pandas Dataframe

如何将字典列表转换为类似于嵌套字典的树?

将文件列表转换为json映射

将 JSON 数据转换为嵌套字典

反序列化具有嵌套字典的JSON文件

将嵌套字典转换为文件

在python中将json文件中的列表转换为字典

将json文件转换为dataframe解析嵌套的json数据

如何使用 json 模块将 python 对象转换为 (json) 嵌套 dict,而不创建类似文件的对象?

使用Python将json文件列表转换为jsonL文件

从文件制作嵌套字典

将可变嵌套列表的大文件转换为JSON

将两个列表转换为动态嵌套字典,然后转换为 JSON

从Python格式类似于JSON文件的列表中提取值

在python中创建嵌套列表/字典的正确方法是什么,类似于类似json的结构?

将嵌套的 JSON 转换为简单的字典 JSON 结构

如何将深度嵌套的JSON文件转换为CSV?

将嵌套的JSON文件转换为R数据框

将CSV文件转换为嵌套的JSON obj

从嵌套的json文件中加载重复键作为列表字典

如何使用带有嵌套列表和字典的Python遍历JSON文件

如何将json文件转换为列表

将 JSON 文件内容转换为 Python 列表

Scrapy - 将嵌套字典生成为 JSON 文件 - 不起作用

Python:将字典列表转换为JSON

将文本文件的嵌套行转换为字典