【问题标题】:Parse numbers and lists from config files with configparser使用 configparser 从配置文件中解析数字和列表
【发布时间】:2021-04-06 08:02:50
【问题描述】:

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

谷歌搜索这个问题,我遇到了this SO thread,它只解决了我的问题的“列表”部分,但使用评价最高的解决方案(在 .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)

但是,这似乎非常不优雅,嵌套如此之多,而且任务本身似乎如此重要,以至于我无法相信没有“更官方”的解决方案,我根本无法找到。

那么,请有人在这里帮助我,告诉我是否真的没有更好、更直接的方法来实现这一目标!?

【问题讨论】:

    标签: python parsing ini configparser


    【解决方案1】:

    我能做的就是这样(虽然它有点老套,也可能很危险):

    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]
    

    这将适用于intsfloats 以及您的逗号分隔值(它会将其评估为一个元组,我想这应该没问题,尽管我为此添加了一个条件)。

    【讨论】:

    • 感谢您的解决方案!我会支持它,但我还没有“声誉”......但是你的解决方案在什么方面是危险的,你能详细说明一下吗?而且,由于我正在为卫星上的实验编写软件,而稳定性是这里的关键,你会推荐你的解决方案而不是我的解决方案吗?
    • 另外,怎么可能没有“官方”解决方案呢?我的意思是它必须是配置文件的重要组成部分来存储各种数据类型还是我在这里做错了什么?
    • 当然,在 try 部分,eval 基本上在解释器中评估你的字符串,所以如果它是一个像 int 或 float 这样的有效类型,它会通过,就像你输入 1 或 1.0在口译员中,您会得到同样的结果。另一方面,如果你写一个不带引号或逗号的字符串,它会返回错误,因此会返回异常部分。这里假设类型是字符串或带逗号的字符串,所以我将其拆分并返回第一个元素(没有逗号拆分的字符串将返回长度为1的列表)或其他情况下的完整列表。
    • 危险,我的意思是使用eval,这对您的情况当然没问题。至于为什么危险,可以看this或者this
    • 哇,这是很多信息。非常感谢您帮助我!我会考虑我需要什么样的类型,然后从那里决定。你有一个很好的......无论你接下来要庆祝的是什么;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 2014-06-03
    • 1970-01-01
    • 2012-02-16
    • 2011-05-01
    相关资源
    最近更新 更多