Python:你将如何保存一个简单的设置/configuration文件?

我不在乎是否是JSON,泡菜,​​YAML或其他什么。

我所见过的所有其他实现都不是向前兼容的,所以如果我有一个configuration文件,在代码中添加一个新的密钥,然后加载该configuration文件,它只会崩溃。

有没有简单的方法来做到这一点?

在Python中的configuration文件

根据所需的文件格式,有几种方法可以做到这一点。

ConfigParser [.ini格式]

除非有令人信服的理由使用不同的格式,否则我会使用标准的configparser方法。

写一个像这样的文件:

 from ConfigParser import SafeConfigParser config = SafeConfigParser() config.read('config.ini') config.add_section('main') config.set('main', 'key1', 'value1') config.set('main', 'key2', 'value2') config.set('main', 'key3', 'value3') with open('config.ini', 'w') as f: config.write(f) 

文件格式非常简单,用方括号标出部分:

 [main] key1 = value1 key2 = value2 key3 = value3 

值可以从文件中提取,如下所示:

 from ConfigParser import SafeConfigParser config = SafeConfigParser() config.read('config.ini') print config.get('main', 'key1') # -> "value1" print config.get('main', 'key2') # -> "value2" print config.get('main', 'key3') # -> "value3" # getfloat() raises an exception if the value is not a float a_float = config.getfloat('main', 'a_float') # getint() and getboolean() also do this for their respective types an_int = config.getint('main', 'an_int') 

JSON [.json格式]

JSON数据可能非常复杂,并具有高度便携性的优势。

将数据写入文件:

 import json config = {'key1': 'value1', 'key2': 'value2'} with open('config.json', 'w') as f: json.dump(config, f) 

从文件读取数据:

 import json with open('config.json', 'r') as f: config = json.load(f) #edit the data config['key3'] = 'value3' #write it back to the file with open('config.json', 'w') as f: json.dump(config, f) 

YAML

这个答案提供了一个基本的YAML例子。 更多细节可以在pyYAML网站上find。

如果你想使用类似INI文件的东西来保存设置,可以考虑使用configparser从文本文件加载键值对,并且可以轻松地写回文件。

INI文件的格式为:

 [Section] key = value key with spaces = somevalue 

ConfigParser基本示例

该文件可以像这样加载和使用:

 #!/usr/bin/env python import ConfigParser import io # Load the configuration file with open("config.yml") as f: sample_config = f.read() config = ConfigParser.RawConfigParser(allow_no_value=True) config.readfp(io.BytesIO(sample_config)) # List all contents print("List all contents") for section in config.sections(): print("Section: %s" % section) for options in config.options(section): print("x %s:::%s:::%s" % (options, config.get(section, options), str(type(options)))) # Print some contents print("\nPrint some contents") print(config.get('other', 'use_anonymous')) # Just get the value print(config.getboolean('other', 'use_anonymous')) # You know the datatype? 

哪个输出

 List all contents Section: mysql x host:::localhost:::<type 'str'> x user:::root:::<type 'str'> x passwd:::my secret password:::<type 'str'> x db:::write-math:::<type 'str'> Section: other x preprocessing_queue:::["preprocessing.scale_and_center", "preprocessing.dot_reduction", "preprocessing.connect_lines"]:::<type 'str'> x use_anonymous:::yes:::<type 'str'> Print some contents yes True 

正如您所看到的,您可以使用易于读写的标准数据格式。 诸如getboolean和getint之类的方法允许您获取数据types而不是简单的string。

编写configuration

 import os configfile_name = "config.yaml" # Check if there is already a configurtion file if not os.path.isfile(configfile_name): # Create the configuration file as it doesn't exist yet cfgfile = open(configfile_name, 'w') # Add content to the file Config = ConfigParser.ConfigParser() Config.add_section('mysql') Config.set('mysql', 'host', 'localhost') Config.set('mysql', 'user', 'root') Config.set('mysql', 'passwd', 'my secret password') Config.set('mysql', 'db', 'write-math') Config.add_section('other') Config.set('other', 'preprocessing_queue', ['preprocessing.scale_and_center', 'preprocessing.dot_reduction', 'preprocessing.connect_lines']) Config.set('other', 'use_anonymous', True) Config.write(cfgfile) cfgfile.close() 

结果是

 [mysql] host = localhost user = root passwd = my secret password db = write-math [other] preprocessing_queue = ['preprocessing.scale_and_center', 'preprocessing.dot_reduction', 'preprocessing.connect_lines'] use_anonymous = True 

XML基本示例

似乎Python社区完全不使用configuration文件。 但是,parsing/编写XML很容易,而且Python有很多可能性。 一个是BeautifulSoup:

 from BeautifulSoup import BeautifulSoup with open("config.xml") as f: content = f.read() y = BeautifulSoup(content) print(y.mysql.host.contents[0]) for tag in y.other.preprocessing_queue: print(tag) 

config.xml可能看起来像这样

 <config> <mysql> <host>localhost</host> <user>root</user> <passwd>my secret password</passwd> <db>write-math</db> </mysql> <other> <preprocessing_queue> <li>preprocessing.scale_and_center</li> <li>preprocessing.dot_reduction</li> <li>preprocessing.connect_lines</li> </preprocessing_queue> <use_anonymous value="true" /> </other> </config> 

保存并加载字典。 你将有任意的键,值和任意数量的键,值对。