当前位置:  开发笔记 > 编程语言 > 正文

在ConfigParser中列出

如何解决《在ConfigParser中列出》经验,为你挑选了8个好方法。

典型的ConfigParser生成的文件如下所示:

[Section]
bar=foo
[Section 2]
bar2= baz

现在,有没有办法索引列表,例如:

[Section 3]
barList={
    item1,
    item2
}

相关问题:每个部分Python的ConfigParser唯一键



1> quasimodo..:

也有点晚了,但也许有些帮助.我正在使用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]部分非常方便.


你必须有["a","b","c"]字符串才能使它们起作用.对我来说,这点击了数字,但因为cfg文件大多是可编辑的 - 每次添加""都很痛苦.我宁愿用逗号然后分开它.

2> David Locke..:

没有什么能阻止您将列表打包成分隔的字符串,然后在从配置中获取字符串后将其解压缩.如果您这样做,您的配置部分将如下所示:

[Section 3]
barList=item1,item2

它并不漂亮,但它适用于大多数简单列表.


这就是Python日志配置文件的工作方式.
如果您有复杂的列表,可以参考这个问题:http://stackoverflow.com/questions/330900/how-to-quickly-parse-a-list-of-strings :-)

3> Henry Cooke..:

迟到了这个派对,但我最近在配置文件中使用专用部分实现了这个列表:

[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

希望这有助于其他民间谷歌搜索这个问题;)


@AlexDean您可以通过设置optionxform = str来设置ConfigParser以使camelCase保持原位.示例:`config = ConfigParser.SafeConfigParser()``config.optionxform = str`然后案件将一个人留下
我喜欢这个解决方案,因为你可以`; 注释掉列表中的某些项目,而不必重写整个列表.

4> Peter Smit..:

许多人不知道的一件事是允许多行配置值.例如:

;test.ini
[hello]
barlist = 
    item1
    item2

现在的价值config.get('hello','barlist')是:

"\nitem1\nitem2"

您可以使用splitlines方法轻松拆分(不要忘记过滤空项).

如果我们看一下像Pyramid这样的大框架他们正在使用这种技术:

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开头; 跟随空白.


.split()在所有空格中断(除非给出特定字符),.splitlines()在所有换行符上中断.

5> PythonTester..:

如果你想直接传入一个列表,那么你可以使用:

ast.literal_eval()

例如配置:

[section]
option=["item1","item2","item3"]

代码是:

import ConfigParser
import ast

my_list = ast.literal_eval(config.get("section", "option"))
print(type(my_list))
print(my_list)

输出:


["item1","item2","item3"]


我希望看到并举例说明,如果您认为有帮助,可以随时在此主题中添加答案,尽管您的评论本身会是一个很好的问题。我给出的答案简化了ConfigParser中列表的使用,因此在应用程序内部是消除了使用正则表达式的麻烦。没有上下文,我无法评论其“安全”价值。

6> John Mee..:

我来这里寻求消费......

[global]
spys = richard.sorge@cccp.gov, mata.hari@deutschland.gov

答案是将其拆分为逗号并删除空格:

SPYS = [e.strip() for e in parser.get('global', 'spys').split(',')]

要获得列表结果:

['richard.sorge@cccp.gov', 'mata.hari@deutschland.gov']

它可能无法准确回答OP的问题,但可能是一些人正在寻找的简单答案.


我以为迪克在`sorger @ espionage.su`!难怪我的邮件不断跳动!> _ <

7> Grr..:

在任何这些答案中都没有提到converterskwargConfigParser()是相当令人失望的.

根据文档,您可以传递字典,ConfigParser这将为get解析器和节代理添加一个方法.所以对于一个列表:

example.ini

[Germ]
germs: a,list,of,names, and,1,2, 3,numbers

解析器示例:

cp = ConfigParser(converters={'list': lambda x: [i.strip() for i in x.split(',')]})
cp.read('example.ini')
cp.getlist('Germ', 'germs')
['a', 'list', 'of', 'names', 'and', '1', '2', '3', 'numbers']
cp['Germ'].getlist('germs')
['a', 'list', 'of', 'names', 'and', '1', '2', '3', 'numbers']

这是我个人的最爱,因为不需要子类化,我不必依赖最终用户来完美地编写JSON或可以解释的列表ast.literal_eval.



8> LittleEaster..:

这是我用于列表的内容:

配置文件内容:

[sect]
alist = a
        b
        c

代码:

l = config.get('sect', 'alist').split('\n')

它适用于字符串

如果是数字

配置内容:

nlist = 1
        2
        3

码:

nl = config.get('sect', 'alist').split('\n')
l = [int(nl) for x in nl]

谢谢.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有