写作与configparser到文件时,定义的config.ini项的顺序?(Define orde

2019-09-29 02:37发布

我使用的是Python的configparser产生config.ini文件来存储我的脚本配置。 该配置是通过代码生成,但文件的一点是,有一个外部的方法来改变程序生成的配置在稍后阶段。 所以文件需要很好地读取和配置选项应该很容易找到。 在configparser的部分是确保一个很好的方式,但是内的区段,该项目似乎是随机排序。 例如,这代码:

import configparser
config = configparser.ConfigParser()

config['DEFAULT'] = {
    'shuffle': 'True',
    'augment': 'True',
    # [... some other options ...] 
    'data_layer_type' : 'hdf5',     
    'shape_img' : '[1024, 1024, 4]',    
    'shape_label' : '[1024, 1024, 1]', 
    'shape_weights' : '[1024, 1024, 1]' 
}

with open('config.ini', 'w') as configfile:
    config.write(configfile)

生成config.ini与顺序-File:

[DEFAULT]
shape_weights = [1024, 1024, 1]
# [... some of the other options ...] 
shuffle = True
augment = True
data_layer_type = hdf5
# [... some of the other options ...] 
shape_img = [1024, 1024, 4]
# [... some of the other options ...] 
shape_label = [1024, 1024, 1]

即,条目是既不在字母或在任何其他可识别的顺序。 但我想顺序,例如形状选项都在同一个地方,而不是分布在用户浏览...

这里是说,无序行为固定在Python 3.1默认使用有序类型的字典,但我使用Python 3.5.2,并得到无序的条目。 是否有一个标志,我需要设置或方式排序的字典,这样会造成(至少)按字母顺序排序项?

有没有一种方法来定义条目顺序编程时产生config.ini与configparser? (Python的3.5)

Answer 1:

这里的问题不在于configparser没有使用OrderedDict内部s时,是你正在做一个无序的文字和分配这一点。

请注意这是如何不排序:

>>> x = {
...     'shuffle': 'True',
...     'augment': 'True',
...     # [... some other options ...] 
...     'data_layer_type' : 'hdf5',     
...     'shape_img' : '[1024, 1024, 4]',    
...     'shape_label' : '[1024, 1024, 1]', 
...     'shape_weights' : '[1024, 1024, 1]' 
... }
>>> for k in x:
...     print(k)
... 
shuffle
augment
shape_img
shape_label
shape_weights
data_layer_type

(这改变了在python3.6实施细节为“小类型的字典”优化部分(所有类型的字典变得订购) - 可能被标准化为python3.7的部分原因是方便)

这里的解决方法是确保你分配OrderedDict到S一路:

config['DEFAULT'] = collections.OrderedDict((
    ('shuffle', 'True'),
    ('augment', 'True'),
    # [... some other options ...] 
    ('data_layer_type', 'hdf5'),     
    ('shape_img', '[1024, 1024, 4]'),    
    ('shape_label', '[1024, 1024, 1]'), 
    ('shape_weights', '[1024, 1024, 1]'), 
))


Answer 2:

所述configparser似乎使用OrderedDicts默认(因为Python 2.7 / 3.1),这使得ConfigParser(dict_type=OrderedDict)过时。 然而,这并不命令由默认项,一个仍然有做手工(至少在我的情况)。

我发现代码做到这一点这里并添加默认排序,以及:

import configparser
from collections import OrderedDict

# [...] define your config sections and set values here

#Order the content of DEFAULT section alphabetically
config._defaults = OrderedDict(sorted(config._defaults.items(), key=lambda t: t[0]))

#Order the content of each section alphabetically
for section in config._sections:
    config._sections[section] = OrderedDict(sorted(config._sections[section].items(), key=lambda t: t[0]))

# Order all sections alphabetically
config._sections = OrderedDict(sorted(config._sections.items(), key=lambda t: t[0] ))


文章来源: Define order of config.ini entries when writing to file with configparser?