【问题标题】:How to store hierarchy information in a nested structure如何在嵌套结构中存储层次结构信息
【发布时间】:2021-04-26 15:47:29
【问题描述】:

希望你们都做得很好!

以下是从文档中提取到 .TXT 文件的内容。 我希望阅读具有以下内容的文本文件:

1 Main Heading 1
1.1 Sub-heading 1
1.2 Sub-heading 2
2 Main Heading 2
2.1 Sub-heading 1
2.1.1 Sub-Sub-heading 1
2.1.2 Sub-Sub-heading 2

阅读后,我想将其动态存储到 Python 字典中,即如下嵌套列表:

{"file name": { "Main Heading 1": { "Sub-heading 1" : [], "Sub-heading 2" : [] }},
              { "Main Heading 2": { "Sub-heading 1": [ "Sub-Sub-heading 1", "Sub-Sub-heading 2" ] } } }

上面不是一个固定的结构,可以动态地处理不同的文件,我将在一个循环中进一步自动化这个过程。 我是嵌套字典的新手,并且被“.txt 文件-> JSON”转换阶段卡住了。在这方面的任何帮助都会非常有帮助。谢谢!!

【问题讨论】:

  • 它会一直达到 3 个级别吗?您的结构也不一致 - 为什么当没有子标题时,子标题在列表中,而不是带有子标题的空列表的 dict?
  • 1.最多3个级别,是的。 2.您建议的结构也对我有用..在问题中编辑了相同的内容。请告诉我您的建议。

标签: python json dictionary text-files file-conversion


【解决方案1】:
import json

toc = """1 Main Heading 1
1.1 Sub-heading 1
1.2 Sub-heading 2
2 Main Heading 2
2.1 Sub-heading 1
2.1.1 Sub-Sub-heading 1
2.1.2 Sub-Sub-heading 2"""

myfile = 'myfile'

data = {myfile:{}}
for line in toc.splitlines():
    levels, title = line.split(' ', maxsplit=1)
    levels = levels.rstrip('.').split('.')
    if len(levels) == 1:
        heading = title
        data[myfile][heading] = {}
    elif len(levels) == 2:
        sub_heading = title
        data[myfile][heading][sub_heading] = []
    if len(levels) == 3:
        data[myfile][heading][sub_heading].append(title)

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

输出

{
    "myfile": {
        "Main Heading 1": {
            "Sub-heading 1": [],
            "Sub-heading 2": []
        },
        "Main Heading 2": {
            "Sub-heading 1": [
                "Sub-Sub-heading 1",
                "Sub-Sub-heading 2"
            ]
        }
    }
}

【讨论】:

  • 简洁明了的代码,伙计。像魅力一样工作!这适用于所有人,除非标题编号以句号结尾,即“1. XYZ”、“2.1. ABC”,我尝试使用 replace() 删除它,但在不影响其他句号的情况下无法正常工作。有什么建议?另外,有没有办法处理像 1 到 1.1.1 而不是 1 到 1.1 然后 1.1.1 的跳转的情况
  • 您可以随时使用 .rstrip('.')` 删除尾随点(如果存在)。我编辑了我的答案
  • 总有办法处理不同的情况,但你描述的 1 -> 1.1.1 没有意义。它表明结构不正确
  • 谢谢,rstrip 工作。关于 1 -> 1.1.1,我知道这是不合逻辑的,但不幸的是,文本输出来自 OCR 处理的 PDF 文档。需要通过以某种方式编辑 1.1.1 到 1.1 来处理它 - 但考虑到我们正在逐行解析文件,不确定如何比较同一 txt 中的两行。
猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
相关资源
最近更新 更多