我有个问题。我的程序是使用配置文件设置选项,其中之一是元组。这是我的意思:

[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/

等...我可以用Python中的ConfigParser模块将其解析为元组吗?有一些简单的方法吗?

有帮助吗?

解决方案

如果您可以这样更改配置格式:

folder = /home/scorpil
         /media/sda5/
         /media/sdb5/

然后在Python:

config.get("common", "folder").split("\n")

其他提示

您的配置可能是:

[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder = ("/home/scorpil", "/media/sda5/", "/media/sdb5/")

假设您在名为foo.cfg的文件中具有配置,则可以执行以下操作:

import ConfigParser
cp = ConfigParser.ConfigParser()
cp.read("foo.cfg")
folder = eval(cp.get("common", "folder"), {}, {})

print folder
print type(folder)

应该产生:

('/home/scorpil','/媒体/sda5/','/媒体/sdb5/')
u003Ctype 'tuple'>

- 编辑 - 从那以后,我改变了主意,并将立即立场,即在这种情况下使用评估是一个坏主意。即使在有限的环境中,如果配置文件处于用户控制之下,也可能是一个非常糟糕的主意。今天,我可能建议您使用Split有趣的事情来避免恶意代码执行。

您可以获取项目列表并使用列表理解来创建名称以定义前缀开头的所有项目的列表,在您的情况下 文件夹

folders = tuple([ item[1] for item in configparser.items() if item[0].startswith("folder")])

创建配置:

folders = ['/home/scorpil', '/media/sda5/', '/media/sdb5/']
config.set('common', 'folders', json.dumps(folders))

负载配置:

tuple(json.loads(config.get('common', 'folders')))

我不知道configparser,但是您可以轻松地将其阅读到列表中(也许使用 .append())然后做 myTuple = tuple(myList)

#!/usr/bin/env python
sample = """
[common]
logfile=log.txt
db_host=localhost
db_user=root
db_pass=password
folder[1]=/home/scorpil
folder[2]=/media/sda5/
folder[3]=/media/sdb5/
"""
from cStringIO import StringIO
import ConfigParser
import re
FOLDER_MATCH = re.compile(r"folder\[(\d+)\]$").match

def read_list(items,pmatch=FOLDER_MATCH):
    if not hasattr(pmatch,"__call__"):
        pmatch = re.compile(pmatch).match
    folder_list = []
    for k,v in items:
        m = pmatch(k)
        if m:
            folder_list.append((int(m.group(1)),v))
    return tuple( kv[1] for kv in sorted(folder_list) )


if __name__ == '__main__':
    cp = ConfigParser.SafeConfigParser()
    cp.readfp(StringIO(sample),"sample")

    print read_list(cp.items("common"))
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top