Cara menyimpan informasi hierarki dalam struktur bersarang

Semoga kalian semua baik-baik saja!

Di bawah ini adalah ekstrak dari dokumen ke dalam file .TXT. Saya ingin membaca file teks dengan konten di bawah ini:

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

Setelah membaca, saya ingin menyimpannya secara DINAMIS ke dalam kamus Python yaitu daftar bersarang seperti di bawah ini:

{"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" ] } } }

Di atas bukanlah struktur tetap dan dapat bersifat dinamis dengan file yang berbeda dan saya akan mengotomatiskan proses lebih lanjut dalam satu lingkaran. Saya baru mengenal kamus bersarang dan terjebak dengan file .txt -› tahap konversi JSON. Bantuan apa pun dalam hal ini akan sangat membantu. Terima kasih!!


person Terminator    schedule 22.01.2021    source sumber
comment
Apakah akan selalu sampai 3 level? Struktur Anda juga tidak konsisten - mengapa ketika tidak ada sub-sub-judul, sub-judul ada dalam daftar, bukan dikte dengan daftar kosong untuk sub-sub-judul?   -  person buran    schedule 22.01.2021
comment
1. Maksimal 3 level ya. 2. Struktur yang Anda sarankan juga akan berfungsi untuk saya.. telah mengedit hal yang sama di pertanyaan. Tolong beri tahu saya saran Anda.   -  person Terminator    schedule 22.01.2021


Jawaban (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))

keluaran

{
    "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
Kode yang bersih dan cemerlang, sobat. Bekerja dengan sangat baik! Ini berfungsi untuk semua kecuali ketika nomor pos diakhiri dengan titik yaitu 1. XYZ, 2.1. ABC, yang saya coba hapus menggunakan replace() tetapi tidak berhasil tanpa memengaruhi titik penuh lainnya. Ada saran? Selain itu, apakah ada cara untuk menangani kasus di mana terdapat lompatan seperti 1 ke 1.1.1, bukan 1 ke 1.1, lalu 1.1.1 - person Terminator; 22.01.2021
comment
Anda selalu dapat .rstrip('.')` menghapus titik tambahan jika ada. Saya mengedit jawaban saya - person buran; 22.01.2021
comment
Selalu ada cara untuk menangani kasus yang berbeda, tetapi apa yang Anda jelaskan 1 -› 1.1.1 tidak masuk akal. Ini menunjukkan struktur yang salah - person buran; 22.01.2021
comment
Terima kasih, rstrip berhasil. Mengenai 1 -› 1.1.1, saya tahu ini tidak logis tetapi sayangnya keluaran teksnya berasal dari dokumen PDF OCR. Perlu menanganinya dengan mengedit 1.1.1 ke 1.1 - tetapi tidak yakin bagaimana cara membandingkan dua baris dalam txt yang sama berfungsi mengingat kami menguraikan file baris demi baris. - person Terminator; 22.01.2021