Я использую файл config.ini для хранения всех своих конфигураций.

Мне нужно сохранить словарь и список в файле конфигурации и проанализировать его в моем файле main.py с помощью configparser. Может кто-нибудь сказать, пожалуйста, как мне это сделать?

Config.ini :

[DEFAULT] 
ADMIN = xyz 
SOMEDICT = {'v1': 'k1', 'v2': 'k2'}
SOMELIST = [v1, v2]

Main.py :

config = configparser.ConfigParser() 
config.read('config.ini') 
secret_key = config['DEFAULT']['ADMIN']

Если нет способа сделать это, является ли конфигурация в формате JSON хорошим вариантом?

1
90abyss 30 Авг 2017 в 00:12

3 ответа

Лучший ответ

ConfigParser будет выдавать вам только те элементы в виде строк, которые вам необходимо будет проанализировать.

В качестве альтернативы YAML является хорошим выбором для файлов конфигурации, поскольку он легко читается человеком. Ваш файл может выглядеть так:

DEFAULT:
    ADMIN: xyz
    SOMEDICT:
        v1: k1
        v2: k2
    SOMELIST:
        - v1
        - v2

И код Python будет:

import yaml
with open('config.yml') as c:
    config = yaml.load(c)
config['DEFAULT']['SOMEDICT']
7
Daniel Roseman 29 Авг 2017 в 21:17

Я бы предложил использовать json:

json.loads('[1, 2]') #=> [1, 2]
json.dumps([1, 2]) #=> '[1, 2]'
json.loads('{"v1": "k1", "v2": "k2"}') #=> {'v1': 'k1', 'v2': 'k2'}
json.dumps({'v1': 'k1', 'v2': 'k2'}) #=> '{"v1": "k1", "v2": "k2"}'

Вам нужно будет сделать dumps перед сохранением и loads после чтения тех полей, для которых вы используете JSON.

Лучшим решением было бы использовать JSON для всего файла конфигурации:

{
  "DEFAULT": {
    "ADMIN": "xyz",
    "SOMEDICT": {
      "v1": "k1",
      "v2": "k2"
    },
    "SOMELIST": [
      "v1",
      "v2"
    ]
  }
}

Тогда вы могли бы сделать:

conf = json.load(open('conf.json'))
json.dump(conf, open('conf.json', 'w'))
2
Danil Speransky 29 Авг 2017 в 21:31

Файл JSON с этими данными может выглядеть так:

{
  "DEFAULT": {
    "ADMIN": "xyz",
    "SOMEDICT": {
      "v1": "k1",
      "v2": "k2"
    },
    "SOMELIST": [
      "v1",
      "v2"
    ]
  }
}

Тогда в питоне:

import json

with open('config.json') as f:
    config = json.load(f)
2
Alex Hall 29 Авг 2017 в 21:20