Frage

Ich habe ein Problem. Mein Programm wird mit Konfigurationsdatei, um Optionen, 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 dies in Tupel mit ConfigParser Modul in Python analysieren? Gibt es eine einfache Möglichkeit, dies zu tun?

War es hilfreich?

Lösung

Wenn Sie Config-Format wie folgt ändern:

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

dann in Python:

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

Andere Tipps

Ihre Config könnte sein:

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

Unter der Annahme, dass Sie config in einer Datei mit dem Namen foo.cfg haben, 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 soll produzieren:

  

( '/ home / scorpil', '/ media / sda5 /', '/ media / sdb5 /')
  

- EDIT - Ich habe meine Meinung über diese seit geändert, und würde die Position heute nehmen, dass in diesem Zusammenhang mit eval ist eine schlechte Idee. Selbst mit einer eingeschränkten Umgebung, wenn die Konfigurationsdatei unter Benutzersteuerung ist, kann es eine sehr schlechte Idee. Heute würde ich wahrscheinlich empfehlen, etwas Interessantes mit zerriss bösartiger Codeausführung zu vermeiden.

Sie können die Artikel Liste erhalten und verwenden, um eine Liste Verständnis eine Liste aller Elemente zu erstellen, deren Name beginnt mit einem definierten Präfix, in Ihrem Fall Ordner

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

Konfiguration erstellen:

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

Lastkonfiguration:

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

Ich weiß nicht, ConfigParser, aber man kann es in eine Liste leicht lesen (vielleicht mit .append()) und führen Sie dann myTuple = tuple(myList)

#!/usr/bin/env python
sample = """
[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/
"""
from cStringIO import StringIO
import ConfigParser
import re
FOLDER_MATCH = re.compile(r"folder\[(\d+)\]$").match

def read_list(items,pmatch=FOLDER_MATCH):
    if not hasattr(pmatch,"__call__"):
        pmatch = re.compile(pmatch).match
    folder_list = []
    for k,v in items:
        m = pmatch(k)
        if m:
            folder_list.append((int(m.group(1)),v))
    return tuple( kv[1] for kv in sorted(folder_list) )


if __name__ == '__main__':
    cp = ConfigParser.SafeConfigParser()
    cp.readfp(StringIO(sample),"sample")

    print read_list(cp.items("common"))
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top