web-dev-qa-db-ja.com

Python:簡単な設定/構成ファイルをどのように保存しますか?

JSONpickleYAML、その他何でも構いません。

私が見た他のすべての実装は前方互換性がないため、構成ファイルがある場合、コードに新しいキーを追加し、その構成ファイルをロードすると、クラッシュします。

これを行う簡単な方法はありますか?

77
user1438098

Pythonの構成ファイル

これを行うには、必要なファイル形式に応じていくつかの方法があります。

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ウェブサイト で見つけることができます。

152
Graeme Stuart

INIファイルのようなものを使用して設定を保持する場合は、テキストファイルからキーと値のペアを読み込み、ファイルに簡単に書き戻すことができる configparser の使用を検討してください。

INIファイルの形式は次のとおりです。

[Section]
key = value
key with spaces = somevalue
10
Tadgh

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でこれを行う可能性は十分にあります。 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>
9
scre_www

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"
1
Richie Bendall

辞書を保存してロードします。任意のキー、値、および任意の数のキー、値のペアがあります。

1
dmitri