Python: Bạn sẽ lưu một tệp cài đặt / cấu hình đơn giản như thế nào?


100

Tôi không quan tâm nếu nó JSON, pickle,YAML , hoặc bất cứ điều gì.

Tất cả các triển khai khác mà tôi đã thấy không tương thích với chuyển tiếp, vì vậy nếu tôi có tệp cấu hình, hãy thêm khóa mới trong mã, sau đó tải tệp cấu hình đó, nó sẽ chỉ bị lỗi.

Có cách nào đơn giản để làm điều này?


1
Tôi tin rằng việc sử dụng .iniđịnh dạng giống như của configparsermô-đun sẽ làm được những gì bạn muốn.
Bakuriu

14
bất kỳ cơ hội chọn câu trả lời của tôi là đúng?
Graeme Stuart

Câu trả lời:


187

Tệp cấu hình trong python

Có một số cách để thực hiện việc này tùy thuộc vào định dạng tệp được yêu cầu.

ConfigParser [định dạng .ini]

Tôi sẽ sử dụng các tiêu chuẩn configparser phương pháp trừ khi có những lý do thuyết phục để sử dụng một định dạng khác nhau.

Viết một tệp như vậy:

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

Định dạng tệp rất đơn giản với các phần được đánh dấu trong ngoặc vuông:

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

Các giá trị có thể được trích xuất từ ​​tệp như sau:

# 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 [định dạng .json]

Dữ liệu JSON có thể rất phức tạp và có ưu điểm là có tính di động cao.

Ghi dữ liệu vào tệp:

import json

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

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

Đọc dữ liệu từ một tệp:

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

Một ví dụ YAML cơ bản được cung cấp trong câu trả lời này . Bạn có thể tìm thêm thông tin chi tiết trên trang web pyYAML .


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

12

Ví dụ về ConfigParser Basic

Tệp có thể được tải và sử dụng như sau:

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

đầu ra nào

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

Như bạn có thể thấy, bạn có thể sử dụng một định dạng dữ liệu chuẩn dễ đọc và dễ ghi. Các phương thức như getboolean và getint cho phép bạn lấy kiểu dữ liệu thay vì một chuỗi đơn giản.

Viết cấu hình

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

kết quả trong

[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

Ví dụ về XML Basic

Có vẻ như không được cộng đồng Python sử dụng cho các tệp cấu hình. Tuy nhiên, phân tích cú pháp / viết XML rất dễ dàng và có rất nhiều khả năng để làm như vậy với Python. Một là 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)

nơi config.xml có thể trông như thế này

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

Mã / ví dụ đẹp. Nhận xét nhỏ - ví dụ YAML của bạn không sử dụng YAML mà là định dạng kiểu INI.
Eric Kramer

Cần lưu ý rằng ít nhất phiên bản python 2 của ConfigParser sẽ chuyển đổi âm thầm danh sách được lưu trữ thành chuỗi khi đọc. I E. CP.set ('section', 'option', [1,2,3]) sau khi lưu và đọc config sẽ là CP.get ('section', 'option') => '1, 2, 3'
Gnudiff

10

Nếu bạn muốn sử dụng một cái gì đó giống như một tập tin INI để cài đặt giữ, xem xét sử dụng configparser đó tải các cặp giá trị quan trọng từ một tập tin văn bản, và có thể dễ dàng ghi lại các tập tin.

Tệp INI có định dạng:

[Section]
key = value
key with spaces = somevalue

2

Lưu và tải từ điển. Bạn sẽ có các khóa, giá trị tùy ý và số lượng cặp khóa, giá trị tùy ý.


tôi có thể sử dụng cấu trúc lại với cái này không?
Lore

1

Hãy thử sử dụng 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

thử sử dụng cfg4py :

  1. Thiết kế phân cấp, hỗ trợ nhiều môi trường, vì vậy đừng bao giờ nhầm lẫn cài đặt nhà phát triển với cài đặt trang sản xuất.
  2. Hoàn thành mã. Cfg4py sẽ chuyển đổi yaml của bạn thành một lớp python, sau đó hoàn thành mã có sẵn trong khi bạn nhập mã của mình.
  3. nhiều nữa ..

KHUYẾN CÁO: Tôi là tác giả của mô-đun này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.