Python: Basit bir ayarları / yapılandırma dosyasını nasıl kaydedersiniz?


106

Umrumda değil o eğer JSON, pickle, YAML, ya da her neyse.

Gördüğüm diğer tüm uygulamalar ileriye dönük uyumlu değil, bu nedenle bir yapılandırma dosyam varsa, koda yeni bir anahtar ekleyin ve ardından bu yapılandırma dosyasını yükleyin, sadece çökecektir.

Bunu yapmanın herhangi bir basit yolu var mı?


1
Modülün .ini-like biçimini kullanmanın configparseristediğinizi yapması gerektiğine inanıyorum .
Bakuriu

15
cevabımı doğru olarak seçme şansım var mı?
Graeme Stuart

Yanıtlar:


199

Python'daki yapılandırma dosyaları

Gerekli dosya formatına bağlı olarak bunu yapmanın birkaç yolu vardır.

ConfigParser [.ini biçimi]

Farklı bir format kullanmak için zorlayıcı nedenler olmadıkça standart yapılandırıcı yaklaşımını kullanırdım.

Şöyle bir dosya yazın:

# 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)

Dosya formatı, köşeli parantez içinde işaretlenmiş bölümlerle çok basittir:

[main]
key1 = value1
key2 = value2
key3 = value3

Değerler dosyadan şu şekilde çıkarılabilir:

# 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 biçimi]

JSON verileri çok karmaşık olabilir ve son derece taşınabilir olma avantajına sahiptir.

Bir dosyaya veri yazın:

import json

config = {'key1': 'value1', 'key2': 'value2'}

with open('config.json', 'w') as f:
    json.dump(config, f)

Bir dosyadan verileri okuyun:

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

Bu cevapta temel bir YAML örneği verilmiştir . PyYAML web sitesinde daha fazla ayrıntı bulunabilir .


8
python 3'te from configparser import ConfigParser config = ConfigParser()
user3148949

12

ConfigParser Temel örneği

Dosya şu şekilde yüklenebilir ve kullanılabilir:

#!/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?

hangi çıktılar

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

Gördüğünüz gibi, okuması ve yazması kolay standart bir veri formatı kullanabilirsiniz. Getboolean ve getint gibi yöntemler, basit bir dize yerine veri türünü almanıza izin verir.

Yapılandırma yazma

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()

sonuçlanır

[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 Temel örneği

Python topluluğu tarafından konfigürasyon dosyaları için hiç kullanılmıyor gibi görünüyor. Bununla birlikte, XML'i ayrıştırmak / yazmak kolaydır ve bunu Python ile yapmak için pek çok olasılık vardır. Biri Güzel Çorba:

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 böyle görünebilir

<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>

Güzel kod / örnekler. Küçük yorum - YAML örneğiniz YAML değil, INI tarzı format kullanıyor.
Eric Kramer

ConfigParser'ın en azından python 2 sürümünün, okunduktan sonra saklanan listeyi sessizce dizeye dönüştürebileceğine dikkat edilmelidir. Yani. CP.set ('bölüm', 'seçenek', [1,2,3]) yapılandırmayı kaydettikten ve okuduktan sonra CP.get ('bölüm', 'seçenek') => '1, 2, 3'
Gnudiff olacaktır

10

Ayarları tutmak için INI dosyası gibi bir şey kullanmak istiyorsanız , bir metin dosyasından anahtar-değer çiftlerini yükleyen ve dosyaya kolayca geri yazabilen yapılandırma ayrıştırıcı kullanmayı düşünün .

INI dosyası şu biçime sahiptir:

[Section]
key = value
key with spaces = somevalue

2

Bir sözlüğü kaydedin ve yükleyin. Keyfi anahtarlara, değerlere ve keyfi sayıda anahtar, değer çiftine sahip olacaksınız.


bununla yeniden düzenleme kullanabilir miyim?
Lore

1

ReadSettings'i kullanmayı deneyin :

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"

-3

cfg4py kullanmayı deneyin :

  1. Hiyerarşik tasarım, çoklu ortam desteği olduğundan, geliştirme ayarlarını üretim sitesi ayarlarıyla asla karıştırmayın.
  2. Kod tamamlama. Cfg4py, yaml'nizi bir python sınıfına dönüştürür, ardından kodunuzu yazarken kod tamamlama kullanılabilir.
  3. çok daha fazlası ..

SORUMLULUK REDDİ: Bu modülün yazarıyım

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.