Python: Bagaimana Anda menyimpan file pengaturan / konfigurasi sederhana?

102

Saya tidak peduli apakah itu JSON, pickle, YAML, atau apa pun.

Semua implementasi lain yang saya lihat tidak kompatibel ke depan, jadi jika saya memiliki file konfigurasi, tambahkan kunci baru dalam kode, lalu muat file konfigurasi itu, itu hanya akan macet.

Apakah ada cara sederhana untuk melakukan ini?

pengguna1438098
sumber
1
Saya percaya menggunakan .iniformat -seperti configparsermodul harus melakukan apa yang Anda inginkan.
Bakuriu
14
ada kemungkinan memilih jawaban saya sebagai benar?
Graeme Stuart

Jawaban:

192

File konfigurasi di python

Ada beberapa cara untuk melakukan ini tergantung pada format file yang diperlukan.

ConfigParser [format .ini]

Saya akan menggunakan pendekatan configparser standar kecuali ada alasan kuat untuk menggunakan format yang berbeda.

Tulis file seperti 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)

Format file sangat sederhana dengan bagian yang ditandai dalam tanda kurung siku:

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

Nilai dapat diekstrak dari file seperti ini:

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

Data JSON bisa sangat kompleks dan memiliki keuntungan karena sangat portabel.

Menulis data ke file:

import json

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

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

Membaca data dari file:

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

Contoh YAML dasar disediakan dalam jawaban ini . Detail selengkapnya dapat ditemukan di situs web pyYAML .

Graeme Stuart
sumber
8
dalam python 3 from configparser import ConfigParser config = ConfigParser()
user3148949
12

Contoh ConfigParser Basic

File tersebut dapat dimuat dan digunakan seperti ini:

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

keluaran yang mana

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

Seperti yang Anda lihat, Anda dapat menggunakan format data standar yang mudah dibaca dan ditulis. Metode seperti getboolean dan getint memungkinkan Anda mendapatkan tipe data alih-alih string sederhana.

Konfigurasi penulisan

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

menghasilkan

[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

Contoh XML Basic

Sepertinya tidak digunakan sama sekali untuk file konfigurasi oleh komunitas Python. Namun, mengurai / menulis XML itu mudah dan ada banyak kemungkinan untuk melakukannya dengan Python. Salah satunya adalah 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)

di mana config.xml akan terlihat seperti ini

<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>
scre_www
sumber
Kode / contoh bagus. Komentar kecil - contoh YAML Anda tidak menggunakan YAML tetapi format gaya INI.
Eric Kramer
Perlu dicatat bahwa setidaknya versi python 2 dari ConfigParser akan secara diam-diam mengubah daftar yang disimpan menjadi string saat membaca. Yaitu. CP.set ('section', 'option', [1,2,3]) setelah menyimpan dan membaca konfigurasi akan menjadi CP.get ('section', 'option') => '1, 2, 3'
Gnudiff
10

Jika Anda ingin menggunakan sesuatu seperti file INI untuk menahan pengaturan, pertimbangkan untuk menggunakan configparser yang memuat pasangan nilai kunci dari file teks, dan dapat dengan mudah menulis kembali ke file tersebut.

File INI memiliki format:

[Section]
key = value
key with spaces = somevalue
Tadgh
sumber
2

Simpan dan muat kamus. Anda akan memiliki kunci, nilai, dan jumlah acak kunci, pasangan nilai.

dmitri
sumber
dapatkah saya menggunakan refactoring dengan ini?
Lore
1

Coba gunakan 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"
Richie Bendall
sumber
-2

coba gunakan cfg4py :

  1. Desain hierarki, mendukung mulitiple env, jadi jangan pernah mengacaukan pengaturan pengembang dengan pengaturan situs produksi.
  2. Penyelesaian kode. Cfg4py akan mengubah yaml Anda menjadi kelas python, kemudian penyelesaian kode tersedia saat Anda mengetik kode Anda.
  3. masih banyak lagi..

PENAFIAN: Saya adalah penulis modul ini

aaron
sumber