Python : 간단한 설정 / 구성 파일을 어떻게 저장 하시겠습니까?


101

난 상관 없어이 있다면 JSON, pickle, YAML, 또는 무엇 이건.

내가 본 다른 모든 구현은 포워드 호환되지 않으므로 구성 파일이 있으면 코드에 새 키를 추가 한 다음 해당 구성 파일을로드하면 충돌이 발생합니다.

이 작업을 수행하는 간단한 방법이 있습니까?


1
.ini같은 configparser모듈 형식을 사용 하면 원하는대로 수행 할 수 있다고 생각합니다.
Bakuriu

14
내 대답을 정답으로 선택할 가능성이 있습니까?
Graeme Stuart

답변:


187

Python의 구성 파일

필요한 파일 형식에 따라 여러 가지 방법이 있습니다.

ConfigParser [.ini 형식]

다른 형식을 사용해야하는 설득력있는 이유가 없다면 표준 구성 파서 접근 방식을 사용합니다.

다음과 같이 파일을 작성하십시오.

# 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 [.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 웹 사이트 에서 확인할 수 있습니다 .


8
파이썬 3 from configparser import ConfigParser config = ConfigParser()
user3148949

12

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 기본 예

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>

좋은 코드 / 예제. 사소한 의견-YAML 예제는 YAML이 아니라 INI 스타일 형식을 사용합니다.
Eric Kramer

적어도 ConfigParser의 python 2 버전은 읽을 때 저장된 목록을 문자열로 자동 변환합니다. 즉. CP.set ( '부', '옵션'[1,2,3]) 설정을 저장하고 읽은 후 ( '부', '옵션') => '1, 2, 3 "을 CP.get 것
Gnudiff

10

INI 파일과 같은 것을 사용하여 설정을 유지하려면 텍스트 파일에서 키 값 쌍을로드하고 파일에 쉽게 다시 쓸 수있는 configparser 를 사용 하는 것이 좋습니다.

INI 파일의 형식은 다음과 같습니다.

[Section]
key = value
key with spaces = somevalue

2

사전을 저장하고로드합니다. 임의의 키, 값 및 임의의 수의 키, 값 쌍을 갖게됩니다.


이것으로 리팩토링을 사용할 수 있습니까?
Lore

1

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"

-2

cfg4py를 사용해보십시오 .

  1. 계층 적 디자인, 다중 환경 지원, 프로덕션 사이트 설정으로 개발 설정을 엉망으로 만들지 마십시오.
  2. 코드 완성. Cfg4py는 yaml을 python 클래스로 변환 한 다음 코드를 입력하는 동안 코드 완성을 사용할 수 있습니다.
  3. 더 많이 ..

면책 조항 : 저는이 모듈의 작성자입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.