关于解析:在Python中使用配置文件的最佳实践是什么?

What's the best practice using a settings file in Python?

我有一个命令行脚本,运行时有很多参数。我现在已经到了一个论点太多的地步,我也想要一些字典形式的论点。

因此,为了简化操作,我希望用设置文件来运行脚本。我真的不知道要用什么库来解析文件。这样做的最佳实践是什么?我当然可以自己动手,但如果有图书馆,我会全力以赴的。

一些"要求":

  • 我不想使用pickle,而是希望它是一个可以轻松读取和编辑的直接文本文件。
  • 我希望能够在其中添加类似字典的数据,也就是说,应该支持某种形式的嵌套。

一个简化的伪示例文件:

1
2
3
4
5
6
7
8
9
10
truck:
    color: blue
    brand: ford
city: new york
cabriolet:
    color: black
    engine:
        cylinders: 8
        placement: mid
    doors: 2


您可以使用常规的python模块,比如config.py,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
truck = dict(
    color = 'blue',
    brand = 'ford',
)
city = 'new york'
cabriolet = dict(
    color = 'black',
    engine = dict(
        cylinders = 8,
        placement = 'mid',
    ),
    doors = 2,
)

像这样使用:

1
2
import config
print config.truck['color']


您提供的示例配置实际上是有效的yaml。事实上,yaml满足了您的所有需求,使用大量语言实现,并且非常人性化。我强烈建议你使用它。pyyaml项目提供了一个很好的python模块,它实现了yaml。

使用yaml模块非常简单:

1
2
import yaml
config = yaml.safe_load(open("path/to/config.yml"))


我发现这是最有用和最容易使用的https://wiki.python.org/moin/configparserexamples(https://wiki.python.org/moin/configparserexamples)

您只需创建一个"myfile.ini",如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[SectionOne]
Status: Single
Name: Derek
Value: Yes
Age: 30
Single: True

[SectionTwo]
FavoriteColor=Green
[SectionThree]
FamilyName: Johnson

[Others]
Route: 66

并检索数据,如:

1
2
3
4
5
6
7
8
9
10
11
12
>>> import ConfigParser
>>> Config = ConfigParser.ConfigParser()
>>> Config
<ConfigParser.ConfigParser instance at 0x00BA9B20>
>>> Config.read("myfile.ini")
['c:\\tomorrow.ini']
>>> Config.sections()
['Others', 'SectionThree', 'SectionOne', 'SectionTwo']
>>> Config.options('SectionOne')
['Status', 'Name', 'Value', 'Age', 'Single']
>>> Config.get('SectionOne', 'Status')
'Single'


yaml和json是存储设置/配置的最简单和最常用的文件格式。pyyaml可用于分析yaml。JSON已经是2.5版本的Python的一部分。yaml是json的超集。JSON将解决除需要转义的多行字符串之外的大多数用例。Yaml也负责处理这些案件。

1
2
3
4
5
>>> import json
>>> config = {'handler' : 'adminhandler.py', 'timeoutsec' : 5 }
>>> json.dump(config, open('/tmp/config.json', 'w'))
>>> json.load(open('/tmp/config.json'))  
{u'handler': u'adminhandler.py', u'timeoutsec': 5}