Я не волнует , если это JSON
, pickle
, YAML
или любой другой .
Все другие реализации, которые я видел, не имеют прямой совместимости, поэтому, если у меня есть файл конфигурации, добавьте новый ключ в код, а затем загрузите этот файл конфигурации, он просто выйдет из строя.
Есть ли простой способ сделать это?
.ini
-подобного форматаconfigparser
модуля должно делать то, что вы хотите.Ответы:
Файлы конфигурации в python
Это можно сделать несколькими способами в зависимости от требуемого формата файла.
ConfigParser [формат .ini]
Я бы использовал стандартный подход configparser, если бы не было веских причин использовать другой формат.
Напишите такой файл:
# python 2.x # from ConfigParser import SafeConfigParser # config = SafeConfigParser() # python 3.x from configparser import ConfigParser config = ConfigParser() 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)
Формат файла очень простой, разделы выделены квадратными скобками:
Значения можно извлечь из файла следующим образом:
# python 2.x # from ConfigParser import SafeConfigParser # config = SafeConfigParser() # python 3.x from configparser import ConfigParser config = ConfigParser() 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 .
источник
from configparser import ConfigParser
config = ConfigParser()
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, позволяют получить тип данных вместо простой строки.
Запись конфигурации
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 Basic
Кажется, что сообщество Python вообще не использует для файлов конфигурации. Однако синтаксический анализ / запись 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>
источник
Если вы хотите использовать что-то вроде INI-файла для хранения настроек, подумайте об использовании configparser, который загружает пары ключ-значение из текстового файла и может легко записывать обратно в файл.
Файл INI имеет формат:
[Section] key = value key with spaces = somevalue
источник
Сохраните и загрузите словарь. У вас будут произвольные ключи, значения и произвольное количество пар ключ, значение.
источник
Попробуйте использовать ReadSettings :
from readsettings import ReadSettings data = ReadSettings("settings.json") # Load or create any json, yml, yaml or toml file data["name"] = "value" # Set "name" to "value" data["name"] # Returns: "value"
источник
попробуйте использовать cfg4py :
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я являюсь автором этого модуля
источник