Массив чтения из файла конфигурации в Python
-
28-09-2019 - |
Вопрос
У меня проблема. Моя программа использует файл конфигурации для установки параметров, и один из этих параметров - кортеж. Вот что я имею в виду:
[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 ... Могу ли я разбирать это в кортеж с модулем ConfigParser в Python? Есть ли кто-нибудь простой способ сделать это?
Решение
Если вы можете изменить формат конфигурации, как это:
folder = /home/scorpil
/media/sda5/
/media/sdb5/
Тогда в Python:
config.get("common", "folder").split("\n")
Другие советы
Ваш конфиг может быть:
[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 /')
u003Ctype 'tuple'>
- Редактировать - Я с тех пор передумал об этом, и сегодня возьму должность, используя Eval в этом контексте, - это плохое представление. Даже с ограниченной средой, если файл конфигурации находится под контролем пользователя, это может быть очень плохой идеей. Сегодня я бы, вероятно, порекомендовал сделать что-то интересное с разделением, чтобы избежать вредоносного выполнения кода.
Вы можете получить список элементов и использовать список пометков для создания списка всех элементов, которые имя которых начинается с определенного префикса, в вашем случае папка
folders = tuple([ item[1] for item in configparser.items() if item[0].startswith("folder")])
Создать конфигурацию:
folders = ['/home/scorpil', '/media/sda5/', '/media/sdb5/']
config.set('common', 'folders', json.dumps(folders))
Загрузить конфигурацию:
tuple(json.loads(config.get('common', 'folders')))
Я не знаю configparser, но вы можете легко прочитать его в список (возможно, используя .append()
) а потом сделать 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"))