【问题标题】:How to store dictionary and list in python config file?如何在 python 配置文件中存储字典和列表?
【发布时间】:2018-02-07 11:01:44
【问题描述】:

我正在使用 config.ini 文件来存储我的所有配置。

我需要在配置文件中存储一个字典和一个列表,并使用 configparser 在我的 main.py 文件中解析它。谁能告诉我该怎么做?

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格式的配置是一个不错的选择吗?

【问题讨论】:

  • 我不知道 .ini 问题的答案,但是是的,JSON 是一个不错的选择。
  • 你会如何在 json 中做到这一点,你能帮忙吗?
  • 另一种选择是在您的 ini 文件中使用与 JSON 兼容的值并使用 json.loads 解析这些值

标签: python config


【解决方案1】:

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']

【讨论】:

  • 这真的很有帮助。为愚蠢的 qs 道歉,但你能告诉我是否有一种简单的方法可以在 python 文件中以字典格式获取它?我的意思是在从配置文件获取设置时,我需要 list 是 list 和 dict 是 dict。
  • 对不起,我不明白你在问什么。上面的代码给你列表和字典格式。
  • 这是我打印时得到的(config['DEFAULT']['SOMEDICT']) -> v1:k1 v2:k2 ...我需要的是 {'v1':' k1', 'v2': 'k2'}
  • 当你使用我上面给出的代码时,print(config['DEFAULT']['SOMEDICT']) 的结果是{'v1': 'k1', 'v2': 'k2'}
  • 但这无关紧要;如果您只想打印它,那么将结果作为字符串给出的原始代码可以正常工作。
【解决方案2】:

包含此数据的 JSON 文件可能如下所示:

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

然后在python中:

import json

with open('config.json') as f:
    config = json.load(f)

【讨论】:

    【解决方案3】:

    我建议使用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 并在读取您使用 JSON 的字段之后执行 loads

    更好的解决方案是对整个配置文件使用 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'))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-13
      • 2015-05-09
      • 2018-12-20
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 2019-12-20
      • 2021-10-06
      相关资源
      最近更新 更多