วิธีจัดเก็บข้อมูลลำดับชั้นในโครงสร้างแบบซ้อน

หวังว่าทุกคนจะทำได้ดีมาก!

ด้านล่างนี้เป็นการแยกจากเอกสารเป็นไฟล์ .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 ความช่วยเหลือใด ๆ เกี่ยวกับเรื่องนี้จะมีประโยชน์มาก ขอบคุณ!!


person Terminator    schedule 22.01.2021    source แหล่งที่มา
comment
มันจะขึ้นถึง 3 ระดับเสมอไปหรือเปล่า? นอกจากนี้ โครงสร้างของคุณก็ไม่สอดคล้องกัน - ทำไมเมื่อไม่มีหัวข้อย่อย หัวข้อย่อยจึงอยู่ในรายการ ไม่ระบุด้วยรายการว่างสำหรับหัวข้อย่อย   -  person buran    schedule 22.01.2021
comment
1. สูงสุดไม่เกิน 3 ระดับใช่ 2. โครงสร้างที่คุณแนะนำก็จะใช้ได้ผลสำหรับฉันเช่นกัน .. ได้แก้ไขแบบเดียวกันในคำถามแล้ว กรุณาแจ้งให้เราทราบข้อเสนอแนะของคุณ   -  person Terminator    schedule 22.01.2021


คำตอบ (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"
            ]
        }
    }
}
person buran    schedule 22.01.2021
comment
รหัสที่สะอาดและยอดเยี่ยมเพื่อน ทำงานเหมือนมีเสน่ห์! วิธีนี้ใช้ได้กับทุกคน ยกเว้นเมื่อหมายเลขหัวเรื่องลงท้ายด้วย fullstop เช่น 1. XYZ, 2.1 ABC ซึ่งฉันพยายามลบโดยใช้การแทนที่ () แต่ใช้งานไม่ได้โดยไม่ส่งผลกระทบต่อฟูลสต็อปอื่นๆ มีข้อเสนอแนะอะไรบ้าง? นอกจากนี้ยังมีวิธีจัดการกับกรณีที่มีการกระโดดเช่น 1 ถึง 1.1.1 แทนที่จะเป็น 1 ถึง 1.1 แล้ว 1.1.1 - person Terminator; 22.01.2021
comment
คุณสามารถ .rstrip('.')` เพื่อลบจุดต่อท้ายได้เสมอหากมี ฉันแก้ไขคำตอบของฉัน - person buran; 22.01.2021
comment
มีวิธีจัดการกับกรณีต่างๆ อยู่เสมอ แต่สิ่งที่คุณอธิบาย 1 -› 1.1.1 นั้นไม่สมเหตุสมผล มันบ่งบอกถึงโครงสร้างที่ไม่ถูกต้อง - person buran; 22.01.2021
comment
ขอบคุณ rstrip ใช้งานได้ เกี่ยวกับ 1 -› 1.1.1 ฉันรู้ว่ามันไร้เหตุผล แต่น่าเสียดายที่ข้อความที่ส่งออกมาจากเอกสาร PDF ของ OCR จะต้องจัดการมันด้วยการแก้ไข 1.1.1 ถึง 1.1 อย่างใด - แต่ไม่แน่ใจว่าการเปรียบเทียบสองบรรทัดใน txt เดียวกันทำงานอย่างไรเมื่อพิจารณาว่าเรากำลังแยกวิเคราะห์ไฟล์ทีละบรรทัด - person Terminator; 22.01.2021