私は気にしない、それはだ場合はJSON
、pickle
、YAML
、または何でも。
私が見た他のすべての実装は前方互換性がないため、構成ファイルがある場合は、コードに新しいキーを追加し、その構成ファイルをロードすると、クラッシュします。
これを行う簡単な方法はありますか?
私は気にしない、それはだ場合はJSON
、pickle
、YAML
、または何でも。
私が見た他のすべての実装は前方互換性がないため、構成ファイルがある場合は、コードに新しいキーを追加し、その構成ファイルをロードすると、クラッシュします。
これを行う簡単な方法はありますか?
回答:
必要なファイル形式に応じて、これを行ういくつかの方法があります。
別のフォーマットを使用するやむを得ない理由がない限り、私は標準の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)
ファイル形式は非常にシンプルで、セクションは角括弧で囲まれています。
[main]
key1 = value1
key2 = value2
key3 = value3
値は次のようにファイルから抽出できます。
# 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データは非常に複雑になる可能性があり、移植性が高いという利点があります。
ファイルにデータを書き込みます。
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の例が提供されています。詳細については、pyYAMLウェブサイトをご覧ください。
from configparser import ConfigParser
config = 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
Pythonコミュニティによる設定ファイルにはまったく使用されないようです。ただし、XMLの解析/作成は簡単で、Pythonを使用してこれを行う可能性はたくさんあります。1つは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"
.ini
-like形式のconfigparser
モジュールを使用することで、希望どおりの結果が得られると思います。