我有个问题。我的程序使用配置文件来设置选项,其中一个选项是元组。这就是我的意思:
[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/
etc ...我可以使用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','/ media / sda5 /','/ media / sdb5 /') <type'tuple'>
- 编辑 - 我已经改变了我的想法,并且今天采取的立场是在这种情况下使用eval是一个坏主意。即使在受限制的环境中,如果配置文件受用户控制,也可能是一个非常糟糕的主意。今天我可能会建议做一些有趣的事情,以避免恶意代码执行。
您可以获取项目列表并使用列表推导来创建一个列表,列出名称以已定义的前缀开头的所有项目,在您的案例文件夹中
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"))