使用 Python 创建 JSON 文件夹树

Creating a JSON folder tree using Python

提问人:damd biker 提问时间:11/2/2023 最后编辑:ddadamd biker 更新时间:11/2/2023 访问量:84

问:

我手头有一个独特的问题。有一个列表包含 Unix 命令的 ls 输出。我必须提取文件名并将它们放在 JSON 树中,其中父文件夹形成文件夹结构,files/空文件夹成为最后一个后代。

我可以对列表中的单个项目执行此操作,但我无法将其应用于整个列表以获取汇总的 JSON。

这是我的审判:

input_str_list = [
  '2023-06-27 13:10:31        772 dexter/lab_report/inventory/rider/jointball/rotatable/archive/LOGS/hammer_file_download_202105011701.log',
  '2023-06-27 13:10:31        772 dexter/lab_report/inventory/rider/jointball/rotatable/LOGS/hammer_file_download_202112021849.log',
  '2023-06-27 13:10:31        146 dexter/lab_report/inventory/rider/jointball/rotatable/SUMMARY/SUMMARY_rotatable_report_2022-04-01.csv',
  '2023-06-27 13:10:32        145 dexter/lab_report/consumable/fastner/jointball/stopscrew/SUMMARY/SUMMARY_stopscrew/SUMMARY_stopscrew_report_2022-04-11.csv'
  ]

for inp_str in input_str_list:
    tree_dict = {}
    test_list = inp_str.split(' ')
    while "" in test_list:
        test_list.remove("")
    file_struct = test_list[-1].split('/')
    for key in reversed(file_struct):
        if key != file_struct[-1]:
            tree_dict = {key: tree_dict}
        else:
            tree_dict = key

    tree_dict_json = json.dumps(tree_dict)
    print(tree_dict_json)

我的输出(在 4 次单独的迭代中完成):enter image description here

所需输出:enter image description here

Python 社区中的某个人可以帮助我解决这个问题并帮助我生成所需的模式吗?

json python-3.x 数据结构

评论


答:

0赞 Tranbi 11/2/2023 #1

首先,您可以 spilt use 以避免手动删除空字符串。然后,您可以使用递归函数创建任何级别的键/字典:re.split

import re
import json

input_str_list = [
  '2023-06-27 13:10:31        772 dexter/lab_report/inventory/rider/jointball/rotatable/archive/LOGS/hammer_file_download_202105011701.log',
  '2023-06-27 13:10:31        772 dexter/lab_report/inventory/rider/jointball/rotatable/LOGS/hammer_file_download_202112021849.log',
  '2023-06-27 13:10:31        146 dexter/lab_report/inventory/rider/jointball/rotatable/SUMMARY/SUMMARY_rotatable_report_2022-04-01.csv',
  '2023-06-27 13:10:32        145 dexter/lab_report/consumable/fastner/jointball/stopscrew/SUMMARY/SUMMARY_stopscrew/SUMMARY_stopscrew_report_2022-04-11.csv'
  ]

tree_dict = {}

def add_keys(d, l):
    if len(l) > 2:
        d.setdefault(l[0], {})
        add_keys(d[l[0]], l[1:])
    else:
        d[l[0]] = l[1]

for inp_str in input_str_list:
    _, _, _, path = re.split(r'\s+', inp_str)
    add_keys(tree_dict, path.split('/'))

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

输出:

{
    "dexter": {
        "lab_report": {
            "inventory": {
                "rider": {
                    "jointball": {
                        "rotatable": {
                            "archive": {
                                "LOGS": "hammer_file_download_202105011701.log"
                            },
                            "LOGS": "hammer_file_download_202112021849.log",
                            "SUMMARY": "SUMMARY_rotatable_report_2022-04-01.csv"
                        }
                    }
                }
            },
            "consumable": {
                "fastner": {
                    "jointball": {
                        "stopscrew": {
                            "SUMMARY": {
                                "SUMMARY_stopscrew": "SUMMARY_stopscrew_report_2022-04-11.csv"
                            }
                        }
                    }
                }
            }
        }
    }
}

评论

0赞 damd biker 11/2/2023
谢谢 它工作得很好。但是我陷入了文件夹相同但文件不同的情况。例如 如何将文件夹中的所有文件显示为列表?input_str_list = [ '2023-08-01 11:28:46 772 dexter/lab_report/inventory/rider/jointball/rotatable/LOGS/hammer_file_download_202207301156.log', '2023-08-02 10:35:21 772 dexter/lab_report/inventory/rider/jointball/rotatable/LOGS/hammer_file_download_202208011119.log', '2023-08-03 22:12:17 772 dexter/lab_report/inventory/rider/jointball/rotatable/LOGS/hammer_file_download_202208022132.log']
0赞 Tranbi 11/2/2023
然后,只要你到达树的末尾,就创建/附加到一个列表:替换为d[l[0]] = l[1]d.setdefault(l[0], []).append(l[1])add_keys
0赞 damd biker 11/2/2023
高超!就像一个魅力。我现在明白了setdefault的概念。非常感谢!
0赞 damd biker 11/3/2023
该逻辑适用于所有情况,但下一个文件比前一个文件少一个文件夹的情况除外。 处理此案有什么想法/建议吗?input_str_list = [ '2023-08-01 11:28:46 772 dexter/lab_report/inventory/rider/jointball/rotatable/LOGS/hammer_file_download_202207301156.log', '2023-08-02 10:35:21 772 dexter/lab_report/inventory/rider/jointball/rotatable/hammer_file_download_202208011119.log']
0赞 Tranbi 11/3/2023
您可以在与文件列表关联的树的末尾引入一个虚拟键:而不是 .同时将语句更改为d.setdefault('_files', []).append(l[0])d[l[0]] = l[1]ifif len(l) > 1