Lists in ConfigParser

后端 未结 15 1949
清酒与你
清酒与你 2020-11-27 09:38

The typical ConfigParser generated file looks like:

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

Now, is there a way to index lists like, for in

相关标签:
15条回答
  • 2020-11-27 10:18

    Also a bit late, but maybe helpful for some. I am using a combination of ConfigParser and JSON:

    [Foo]
    fibs: [1,1,2,3,5,8,13]
    

    just read it with:

    >>> json.loads(config.get("Foo","fibs"))
    [1, 1, 2, 3, 5, 8, 13]
    

    You can even break lines if your list is long (thanks @peter-smit):

    [Bar]
    files_to_check = [
         "/path/to/file1",
         "/path/to/file2",
         "/path/to/another file with space in the name"
         ]
    

    Of course i could just use JSON, but i find config files much more readable, and the [DEFAULT] Section very handy.

    0 讨论(0)
  • 2020-11-27 10:20

    No mention of the converters kwarg for ConfigParser() in any of these answers was rather disappointing.

    According to the documentation you can pass a dictionary to ConfigParser that will add a get method for both the parser and section proxies. So for a list:

    example.ini

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

    Parser example:

    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']
    

    This is my personal favorite as no subclassing is necessary and I don't have to rely on an end user to perfectly write JSON or a list that can be interpreted by ast.literal_eval.

    0 讨论(0)
  • 2020-11-27 10:20

    So another way, which I prefer, is to just split the values, for example:

    #/path/to/config.cfg
    [Numbers]
    first_row = 1,2,4,8,12,24,36,48
    

    Could be loaded like this into a list of strings or integers, as follows:

    import configparser
    
    config = configparser.ConfigParser()
    config.read('/path/to/config.cfg')
    
    # Load into a list of strings
    first_row_strings = config.get('Numbers', 'first_row').split(',')
    
    # Load into a list of integers
    first_row_integers = [int(x) for x in config.get('Numbers', 'first_row').split(',')]
    

    This method prevents you from needing to wrap your values in brackets to load as JSON.

    0 讨论(0)
提交回复
热议问题