Stringmanipulation/ Regex/ RawConfigParser

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
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Hallo Leute,

Folgende Frage:
Ich verwende eine *.ini Datei. Diese wurde über den RawConfigParser ausgelesen. So viel als Kurzinformation, ist aber im Prinzip irrelevant. Worum es mir geht ist folgendes. Ich habe eine Option in dieser Datei in welche vom Nutzer mit Komma getrennt Parameter eingegeben werden können. Dem Nutzer steht es dabei frei wie viele er eingeben will. Ich möchte diese durch Komma getrennten Werte nun in meinem Programm in einer Liste abspeichern... Gibt es hier irgendeine Funktion oder kann man das sinnvoll mit regex o.ä. lösen?

Beispiel:
Eingabe:
option=a,b,c,d,e,f
Ausgabe
print list
["a","b","c","d","e","f"]

Danke für die Hilfe!

Killigen
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

split?
BlackJack

@Killigen: Zeichenketten an einer Teilzeichenkette zerlegen, also Beispielsweise einem Komma, ist eine der Grundoperationen auf Zeichenketten. Die sollte man kennen: `split()`. Genau wie die Umkehrfunktion `join()`.

Bist Du auf INI festgelegt? Mit JSON lässt sich so etwas leichter lösen, das Format kennt bereits Arrays die in Python zu Listen geparst werden.
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Das geht mit ``'a,b,c,d,e,f'.split(',')``.

Dass diese Funktionalität im `argparse`-Modul integriert ist, wäre mir neu. Du wirst das also wohl als ein Argument parsen müssen, um anschließend das Argument – wie gezeigt – mittels `split()` aufzuspalten.

EDIT:
Hatte mich verlesen. Die Aussage gilt aber ebenso für den `ConfigParser`.
Killigen
User
Beiträge: 48
Registriert: Freitag 6. März 2015, 10:46

Ok! Alles klar... Danke für die Antwort! ;)
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

BlackJack hat geschrieben:Bist Du auf INI festgelegt? Mit JSON lässt sich so etwas leichter lösen, das Format kennt bereits Arrays die in Python zu Listen geparst werden.
JSON hat keine Kommentare was für Konfiguration jetzt nicht so toll ist. Man kann ConfigParser in Python 3 auch recht leicht erweitern, um solche Listen zu unterstützen:

Code: Alles auswählen

from configparser import ConfigParser
from operator import methodcaller


def get_config_parser(cls=ConfigParser, **kwargs):
    converters = kwargs.setdefault('converters', {})
    converters['list'] = methodcaller('split', ',')
    return cls(**kwargs)


def main():
    parser = get_config_parser()
    parser.read_string("""
    [main]
    option=a,b,c,d,e,f
    """)
    assert parser.getlist('main', 'option') == ['a', 'b', 'c', 'd', 'e', 'f']


if __name__ == '__main__':
    main()
BlackJack

@DasIch: Wenn man Kommentare braucht, wäre YAML eine Alternative. JSON ist da ja (fast) eine Untermenge von.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

YAML ist allerdings ziemlich komplex und hat einige Features wie implizite Typen und Serialisierung die Verwirrung und Sicherheitsprobleme verursachen. Mein Eindruck ist dass deswegen inzwischen viele Leute davon inzwischen wieder weg sind.

Ich glaub ich würde es vielleicht eher mit TOML probieren. Die Syntax ist INI recht ähnlich ist aber mächtiger ohne die absurde Komplexität von YAML anzunehmen.
Antworten