Python 使用configparser分析配置文件中的数字和列表

Python 使用configparser分析配置文件中的数字和列表,python,parsing,ini,configparser,Python,Parsing,Ini,Configparser,我正在为我的期末论文做一个相对较大的项目,因此我使用一个.ini文件来存储和检索设置。但是,对于如何将Configparser返回的字符串(实际上是字典中的字符串)转换为数字(int和float)和/或列表,我无法找到一个优雅的解决方案 在谷歌上搜索这个问题,我发现它只解决了我问题中的“列表”部分,但使用顶级解决方案(在.ini文件中定义列表,如:list=item1,item2)对我没有任何帮助,因为“列表”在解析后仍然显示为字符串。另外,我不想改变格式 因此,我决定亲自尝试,并提出了以下解决

我正在为我的期末论文做一个相对较大的项目,因此我使用一个.ini文件来存储和检索设置。但是,对于如何将Configparser返回的字符串(实际上是字典中的字符串)转换为数字(int和float)和/或列表,我无法找到一个优雅的解决方案

在谷歌上搜索这个问题,我发现它只解决了我问题中的“列表”部分,但使用顶级解决方案(在.ini文件中定义列表,如:list=item1,item2)对我没有任何帮助,因为“列表”在解析后仍然显示为字符串。另外,我不想改变格式

因此,我决定亲自尝试,并提出了以下解决方案:

import configparser 

# create a new instance of a 'ConfigParser' class
config = configparser.ConfigParser()
# create mock-content for the config file
config["Test"] = {
"test_string":"string",
"test_int":"2",
"test_float":"3.0",
"test_list":"item1, item2"
}
# get the relevant settings
settings = config["Test"]
# pack the relevant settings into a dictionary
settings = dict(settings)
# iterate through all the key-value pairs and convert them, if possible
for key, value in settings.items():
    # try to convert to int
    try:
        settings[key] = int(value)
    # if the value can't be converted to int, it might be a float or a list
    except ValueError:
        # try converting it to a float
        try:
            settings[key] = float(value)
        # if the value can't be converted to float, try converting to list
        except ValueError:
            if "," in value:
                cont = value.split(",")
                settings[key] = [item.strip() for item in cont]
            else:
                settings[key] = value
print(type(settings["test_string"]))
print(settings)
然而,这似乎非常不雅观,而且嵌套太多,任务本身似乎非常重要,以至于我无法相信没有“更正式”的解决方案,我根本无法找到

所以,请有人帮我一下,告诉我是否真的没有更好、更直接的方法来实现这一点

我能做的最好的事情就是这样(尽管这有点骇人,可能也很危险):


这对于
ints
float
以及逗号分隔的值(它将作为元组进行计算,我想这应该没问题,尽管我已经为此添加了一个条件)。

感谢您的解决方案!我想提高投票率,但我还没有“名声”。。。但是你的解决方案在什么方面是危险的,你能详细说明一下吗?而且,既然我正在为一个卫星实验编写一个软件,稳定性是这里的关键,你会推荐你的解决方案,而不是我的解决方案,关于稳定性还是其他方面?还有,怎么可能没有“官方”的解决方案呢?我的意思是,存储各种数据类型必须是配置文件的一个重要部分,还是我在这里做错了什么?当然,在try部分,
eval
基本上在解释器中计算字符串,因此如果它是int或float等有效类型,它将通过,这就像在解释器中键入1或1.0时,您会得到相同的结果。另一方面,如果您编写一个不带引号或逗号的字符串,它将返回错误,因此将返回except部分。这里,假设类型是string或带逗号的string,因此我将其拆分并返回第一个元素(在其周围不带逗号的string将返回长度为1的列表)或在其他情况下返回完整的列表。所谓危险,我的意思是使用
eval
,这对于您的情况来说肯定很好。至于为什么它是危险的,你可以看到或者。哇,这是很多信息。非常感谢你帮了我的忙!我会考虑我需要什么样的类型,然后从那里决定。你有一个很好的。。。无论你接下来要庆祝什么;)
for key, value in settings.items():
    try: # will handle both ints and floats, even tuples with ints/floats
        settings[key] = eval(value)
    except NameError: # this means it's a string or a tuple with strings
        get_val = list(map(str.strip, value.split(",")))
        settings[key] = get_val if get_val[1:] else get_val[0]