从配置文件中检索多个值

时间:2019-02-12 06:11:30

标签: python

我有一个配置如下的文件:

settingA=3
settingB=6
settingC=12
settingD=5
#Item 1
item1_A=0
item1_B=2
item1_C=8
#Item 2
item2_A=1
item2_B=1
item2_C=9
#Item 3
item3_A=1
item3_B=4
item3_C=3

我想提取一些变量以执行一些计算。 如果设置了itemN的A变量,那么我想在计算中包括itemN的变量B和C。 给定上面输出的示例配置文件,我要计算的是:

settingA + settingB * ((item2_B * item2_C) + (item3_B * item3_C))
3 + 6 * ((1 * 9) + (4 * 3))
=129

我尝试将整个文件加载到字典中,但是后来我不知道如何正确地遍历字典值。 我可以得到想要的输出,但是我已经硬编码了每个设置/项目变量:

def get_pair(line):
    key, sep, value = line.strip().partition("=")
    return key, value

with open("config.txt") as fd:    
    d = dict(get_pair(line) for line in fd)

settingA = int(d.get("settingA"))
settingB = int(d.get("settingB"))

item1_A = int(d.get("item1_A"))
item1_B = int(d.get("item1_B"))
item1_C = int(d.get("item1_C"))

item2_A = int(d.get("item2_A"))
item2_B = int(d.get("item2_B"))
item2_C = int(d.get("item2_C"))

item3_A = int(d.get("item3_A"))
item3_B = int(d.get("item3_B"))
item3_C = int(d.get("item3_C"))

item1_total = 0
if(item1_A == 1):
    item1_total = item1_B * item1_C

item2_total = 0
if(item2_A == 1):
    item2_total = item2_B * item2_C

item3_total = 0
if(item3_A == 1):
    item3_total = item3_B * item3_C

total = settingA + settingB * (item1_total + item2_total + item3_total)
print(total)

我正在尝试将硬编码的解决方案转换为通用的解决方案,在该解决方案中可以迭代任意数量的项目。

1 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,通过更改配置,这是一个非常简单的解决方案。例如,JSON:

# contents of config.json
{
    "settings": [3, 6, 12, 5],
    "items": [
        {"A": 0, "B": 2, "C": 8},
        {"A": 1, "B": 1, "C": 9},
        {"A": 1, "B": 4, "C": 3}
    ]
}

然后您可以在Python中加载json

import json

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

total = config['settings'][0]

scalar = sum(item['B'] * item['C'] for item in config['items'] if item['A'])
total += config['settings'][1] * scalar

您的评论似乎关闭了更改配置文件的大门,因此,您的新工作应该是将现有(不良)配置解析为更可用的东西,例如上述JSON。一旦完成,上面的方法应该可以很好地工作。