Чтение массива из конфигурационного файла в Python - PullRequest
5 голосов
/ 04 ноября 2010

У меня проблема.Моя программа использует конфигурационный файл для установки параметров, и один из этих параметров - кортеж.Вот что я имею в виду:

[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/

и т.д ... Могу ли я разобрать это в кортеж с модулем ConfigParser в Python?Есть ли какой-нибудь простой способ сделать это?

Ответы [ 6 ]

9 голосов
/ 02 июля 2012

если вы можете изменить формат конфигурации следующим образом:

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

, то в python:

config.get("common", "folder").split("\n")
4 голосов
/ 04 ноября 2010

Ваша конфигурация может быть:

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

Предполагая, что у вас есть конфигурация в файле с именем foo.cfg, вы можете сделать следующее:

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

print folder
print type(folder)

, что должно привести к:

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

- РЕДАКТИРОВАТЬ - С тех пор я изменил свое мнение по этому поводу, и сегодня бы занял позицию, что использование eval в этом контексте - плохая идея.Даже при ограниченном окружении, если файл конфигурации находится под контролем пользователя, это может быть очень плохой идеей.Сегодня я бы порекомендовал сделать что-то интересное с split, чтобы избежать выполнения вредоносного кода.

3 голосов
/ 04 ноября 2010

Вы можете получить список элементов и использовать его для создания списка всех элементов, имя которых начинается с определенного префикса, в вашем случае папка

folders = tuple([ item[1] for item in configparser.items() if item[0].startswith("folder")])
2 голосов
/ 19 декабря 2017

Создание конфигурации:

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

Загрузка конфигурации:

tuple(json.loads(config.get('common', 'folders')))
1 голос
/ 04 ноября 2010
#!/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"))
1 голос
/ 04 ноября 2010

Я не знаю ConfigParser, но вы можете легко прочитать его в список (возможно, используя .append()), а затем сделать myTuple = tuple(myList)

...