9 Stimmen

Lesen eines Arrays aus einer Konfigurationsdatei in Python

Ich habe ein Problem. Mein Programm verwendet die Konfigurationsdatei, um Optionen zu setzen, und eine dieser Optionen ist ein Tupel. Hier ist, was ich meine:

[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/

etc... Kann ich diese in Tupel mit ConfigParser Modul in Python parsen? Gibt es eine einfache Möglichkeit, dies zu tun?

14voto

Alex Punkte 135

Wenn Sie das Format der Konfiguration wie folgt ändern können:

folder = /home/scorpil
         /media/sda5/
         /media/sdb5/

dann in Python:

config.get("common", "folder").split("\n")

6voto

Ihre Konfiguration könnte so aussehen:

[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder = ("/home/scorpil", "/media/sda5/", "/media/sdb5/")

Angenommen, Sie haben Ihre Konfiguration in einer Datei namens foo.cfg gespeichert, dann können Sie Folgendes tun:

import ConfigParser
cp = ConfigParser.ConfigParser()
cp.read("foo.cfg")
folder = eval(cp.get("common", "folder"), {}, {})

print folder
print type(folder)

was zu einem Ergebnis führen sollte:

('/home/scorpil', '/media/sda5/', '/media/sdb5/')
<Typ 'Tupel'>

-- EDIT -- Ich habe inzwischen meine Meinung darüber geändert und würde heute die Position vertreten, dass die Verwendung von eval in diesem Zusammenhang eine schlechte Idee ist. Selbst in einer eingeschränkten Umgebung kann es eine sehr schlechte Idee sein, wenn die Konfigurationsdatei unter Benutzerkontrolle steht. Heute würde ich wahrscheinlich empfehlen, etwas Interessantes mit split zu machen, um die Ausführung von bösartigem Code zu vermeiden.

4voto

Tai Punkte 81

Konfiguration erstellen:

folders = ['/home/scorpil', '/media/sda5/', '/media/sdb5/']
config.set('common', 'folders', json.dumps(folders))

Konfiguration laden:

tuple(json.loads(config.get('common', 'folders')))

3voto

Rod Punkte 47842

Sie können die Artikelliste abrufen und ein Listenverständnis verwenden, um eine Liste aller Artikel zu erstellen, deren Name mit einem bestimmten Präfix beginnt, in Ihrem Fall dossier

folders = tuple([ item[1] for item in configparser.items() if item[0].startswith("folder")])

1voto

Niel de Wet Punkte 6956

Ich kenne ConfigParser nicht, aber man kann sie leicht in eine Liste einlesen (vielleicht mit .append() ) und tun dann myTuple = tuple(myList)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X