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?

1voto

Terrel Shumway Punkte 454
#!/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"))

1voto

woodz Punkte 527

Sie könnten komplett bei json bleiben

tst.json

{
  "common": {
    "logfile":"log.txt",
    "db_host":"localhost",
    "db_user":"root",
    "db_pass":"password",
    "folder": [
      "/home/scorpil",
      "/media/sda5/",
      "/media/sdb5/"
    ]
  }
}

dann mit ihm arbeiten

$ python3

>>> import json
>>> with open("tst.json", "r", encoding="utf8") as file_object:
...   job = json.load(file_object)
... 
>>> job
{'common': {'db_pass': 'password', 'logfile': 
'log.txt', 'db_user': 'root', 'folder': 
['/home/scorpil', '/media/sda5/', '/media/sdb5/'], 
'db_host': 'localhost'}}

>>> print (job["common"]["folder"][0])
/home/scorpil
>>> print (job["common"]["folder"][1])
/media/sda5/
print (job["common"]["folder"][2])
/media/sdb5/

>>> folder_tuple = tuple(job["common"]["folder"])
>>> folder_tuple
('/home/scorpil', '/media/sda5/', '/media/sdb5/')

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