ConfigParser生成的典型文件如下所示:
[Section]
bar=foo
[Section 2]
bar2= baz
现在,有没有一种方法来索引列表,例如:
[Section 3]
barList={
item1,
item2
}
相关问题:Python的ConfigParser每个节的唯一键
ConfigParser生成的典型文件如下所示:
[Section]
bar=foo
[Section 2]
bar2= baz
现在,有没有一种方法来索引列表,例如:
[Section 3]
barList={
item1,
item2
}
相关问题:Python的ConfigParser每个节的唯一键
当前回答
对split(',')的改进可能是将逗号分隔的值视为CSV文件中的一条记录
import csv
my_list = list(csv.reader([config['Section 3']['barList']], dialect=csv.excel))[0]
您可以配置一种方言来解析任何您喜欢的CSV样式。
其他回答
很多人不知道的一件事是允许多行配置值。例如:
;test.ini
[hello]
barlist =
item1
item2
config.get('hello','barlist')的值现在将是:
"\nitem1\nitem2"
你可以很容易地用splitlines方法进行分割(不要忘记过滤空项)。
如果我们看看像金字塔这样的大框架,他们正在使用这种技术:
def aslist_cronly(value):
if isinstance(value, string_types):
value = filter(None, [x.strip() for x in value.splitlines()])
return list(value)
def aslist(value, flatten=True):
""" Return a list of strings, separating the input based on newlines
and, if flatten=True (the default), also split on spaces within
each line."""
values = aslist_cronly(value)
if not flatten:
return values
result = []
for value in values:
subvalues = value.split()
result.extend(subvalues)
return result
源
我自己,我可能会扩展ConfigParser,如果这是一个常见的事情为你:
class MyConfigParser(ConfigParser):
def getlist(self,section,option):
value = self.get(section,option)
return list(filter(None, (x.strip() for x in value.splitlines())))
def getlistint(self,section,option):
return [int(x) for x in self.getlist(section,option)]
注意,在使用这种技术时需要注意一些事情
作为项目的新行应该以空格开始(例如空格或制表符) 下面所有以空格开头的行都被认为是前一项的一部分。如果它有一个=号或者如果它以a开头;跟着空格。
json。负载& ast.literal_eval似乎工作,但配置中的简单列表将每个字符视为字节,因此返回偶数方括号....
这意味着如果配置字段值= [1,2,3,4,5]
然后config.read (* . cfg) config['fieldValue'][0]返回[代替1
我使用ConfigParser和JSON的组合:
[Foo]
fibs: [1,1,2,3,5,8,13]
只需阅读:
>>> json.loads(config.get("Foo","fibs"))
[1, 1, 2, 3, 5, 8, 13]
如果你的列表很长,你甚至可以断行(谢谢@peter-smit):
[Bar]
files_to_check = [
"/path/to/file1",
"/path/to/file2",
"/path/to/another file with space in the name"
]
当然,我可以只使用JSON,但我发现配置文件更可读,和[DEFAULT]部分非常方便。
我最近在配置文件中实现了一个列表的专用部分:
[paths]
path1 = /some/path/
path2 = /another/path/
...
使用config。Items ("paths")来获取路径项的可迭代列表,如下所示:
path_items = config.items( "paths" )
for key, path in path_items:
#do something with path
如果这是你的config.ini:
[Section 3]
barList=item1,item2
然后使用configparser你可以这样做:
from configparser import ConfigParser
config = ConfigParser()
config.read('config.ini')
my_list = config['Section 3']['barList'].split(',')
你会得到:
my_list = ['item1', 'item2']
split()方法将返回一个列表,参见Python字符串文档。
如果你在config.ini中有空格,像这样:
[Section 3]
barList= item1, item2
那你最好这样做:
my_list = [x.strip() for x in config['Section 3']['barList'].split(',')]
如果你的项目是数字(例如整数),只需应用:
my_list_of_ints = list(map(int, my_list))
你会得到:
my_list_of_ints = [item1, item2]