Einlesen bestimmter Bereiche einer Datei

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
tchaluppa
User
Beiträge: 7
Registriert: Mittwoch 2. August 2023, 10:55

Hallo,

eventuell hat einer von Euch mal ein Denkanstoß.

Und zwar habe ich eine Datei, die eine .ini gleicht.

Der Aufbau ist

Code: Alles auswählen

[1]
bla=blubb
blabla=blubb

[2]
bla=blubb
blabla=blubb

[3]
bla=blubb
blabla=blubb
Nun möchte ich zum Beispiel nur den Block aus Sektion 2 in eine Liste speichern.

Dazu habe ich bisher folgendes:

Code: Alles auswählen

line_list = []
with open("test.ini", "r") as inifile:
    for line in inifile:
        line = line.rstrip()
        line_list.append(line)

    for line in line_list:
        if "["+str(2)+"]" in line:
        print("Block 2 Startpunkt")
Meine Idee war jetzt, ab den Eintrag [2] eine weitere Liste anzulegen, und die Einträge so lang hinzuzufügen, bis Sektion [3] erreicht ist.
Allerdings hab ich jetzt nach 2 Stunden keine Idee mehr, wie ich das am besten umsetze.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Dafür gibt es configparser:

Code: Alles auswählen

import configparser

config = configparser.ConfigParser()
with open("test.ini", encoding="ASCII") as file:
    config.read_file(file)

print(dict(config['2']))
tchaluppa
User
Beiträge: 7
Registriert: Mittwoch 2. August 2023, 10:55

Genau den kann ich nicht nehmen, da ich in bestimmten keys auch # Zeichen drin habe. Deswegen arbeite ich an einer eigenen Lösung, die das # nicht als Kommentar sieht
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

per comment_prefixes kann man das ändern.
tchaluppa
User
Beiträge: 7
Registriert: Mittwoch 2. August 2023, 10:55

per comment_prefixes kann man das ändern.
Sirius3,
vielen Dank. Das war mir neu. Nun wird das # auch dargestellt.
Um den eigenen Wissensstand aufzubessern, werde ich mich trotzdem mal an meinem Miniprojekt versuchen.

LG
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Einen Parser zu schreiben, erfordert immer das selbe vorgehen:
zuerst malt man sich einen "Endlichen Automaten" auf, in dem man sich überlegt, in welchen Zuständen man sich jeweils befinden kann. Hier also, am die Zustände "Anfang einer neuen Zeile", "Innerhalb eines Section Header", "Innerhalb eines Schlüssels", "Innerhalb eines Wertes", "Innerhalb eines Kommentars".
Mit jedem Zeichen kann sich der Zustand ändern, also am "Anfang einer Zeile" geht man mit "[“ in den Zustand "Innerhlab eines Section Headers" über, bei "%" aber zu "Innerhalb eines Kommentars, mit jedem anderen Zeichen nach "innerhalb eines Schlüssels".
Wenn Du das einmal vollständig auf ein Papier aufgemalt hast, ist die Umsetzung in Code einfach.
Vor allem hat man die Sicherheit, dass man keinen Zustand oder Übergang vergessen hat.
Es ist einfach Erweiterungen einzubauen, von denen es ja bei ini eine unübersehbare Anzahl gibt.

Deine bisheriger Ansatz dagegen ist voller Fehler. "[2]" hat nur eine besondere Bedeutung im Zustand "Anfang einer neuen Zeile", sonst könnte es auch Teil eines Kommentars oder eines Schlüsselwertes sein.
Antworten