Nie obchodzi mnie, czy to JSON
, pickle
, YAML
, lub cokolwiek innego.
Wszystkie inne implementacje, które widziałem, nie są kompatybilne z wyprzedzeniem, więc jeśli mam plik konfiguracyjny, dodaję nowy klucz do kodu, a następnie załaduj ten plik konfiguracyjny, po prostu się zawiesi.
Czy jest jakiś prosty sposób na zrobienie tego?
.ini
podobnego formatuconfigparser
modułu powinno zrobić to, co chcesz.Odpowiedzi:
Pliki konfiguracyjne w Pythonie
W zależności od wymaganego formatu pliku można to zrobić na kilka sposobów.
ConfigParser [format .ini]
Użyłbym standardowego podejścia configparser, chyba że istniałyby istotne powody, aby użyć innego formatu.
Napisz taki plik:
# 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)
Format pliku jest bardzo prosty z sekcjami zaznaczonymi w nawiasach kwadratowych:
Wartości można wyodrębnić z pliku w następujący sposób:
# 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 [format .json]
Dane JSON mogą być bardzo złożone i mają tę zaletę, że są wysoce przenośne.
Zapisz dane do pliku:
import json config = {'key1': 'value1', 'key2': 'value2'} with open('config.json', 'w') as f: json.dump(config, f)
Odczytaj dane z pliku:
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
W tej odpowiedzi podano podstawowy przykład YAML . Więcej szczegółów można znaleźć na stronie internetowej pyYAML .
źródło
from configparser import ConfigParser
config = ConfigParser()
Przykład ConfigParser Basic
Plik można załadować i używać w następujący sposób:
#!/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?
które wyjścia
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
Jak widać, możesz użyć standardowego formatu danych, który jest łatwy do odczytu i zapisu. Metody takie jak getboolean i getint pozwalają na pobranie typu danych zamiast prostego ciągu.
Zapisywanie konfiguracji
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()
prowadzi do
[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
Przykład XML Basic
Wydaje się, że w ogóle nie jest używany do plików konfiguracyjnych przez społeczność Pythona. Jednak parsowanie / pisanie XML jest łatwe i istnieje wiele możliwości zrobienia tego w Pythonie. One is 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)
gdzie config.xml może wyglądać tak
<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>
źródło
Jeśli chcesz użyć czegoś takiego jak plik INI do przechowywania ustawień, rozważ użycie configparser, który ładuje pary klucz-wartość z pliku tekstowego i może łatwo zapisać z powrotem do pliku.
Plik INI ma format:
[Section] key = value key with spaces = somevalue
źródło
Zapisz i załaduj słownik. Będziesz mieć dowolne klucze, wartości i dowolną liczbę kluczy, par wartości.
źródło
Spróbuj użyć 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"
źródło
spróbuj użyć cfg4py :
ZRZECZENIE SIĘ: Jestem autorem tego modułu
źródło