Python: คุณจะบันทึกไฟล์ settings / config แบบธรรมดาได้อย่างไร?


108

ฉันไม่สนใจถ้ามันJSON, pickle, YAMLหรืออะไรก็ตาม

การใช้งานอื่น ๆ ทั้งหมดที่ฉันเห็นไม่สามารถใช้งานร่วมกันได้ดังนั้นหากฉันมีไฟล์กำหนดค่าให้เพิ่มคีย์ใหม่ในโค้ดจากนั้นโหลดไฟล์กำหนดค่านั้นมันจะผิดพลาด

มีวิธีง่ายๆในการทำเช่นนี้หรือไม่?


1
ฉันเชื่อว่าการใช้.iniรูปแบบ -like ของconfigparserโมดูลควรทำในสิ่งที่คุณต้องการ
Bakuriu

15
มีโอกาสที่จะเลือกคำตอบของฉันว่าถูกต้องหรือไม่?
Graeme Stuart

คำตอบ:


201

ไฟล์คอนฟิกูเรชันใน python

มีหลายวิธีในการดำเนินการนี้ขึ้นอยู่กับรูปแบบไฟล์ที่ต้องการ

ConfigParser [รูปแบบ .ini]

ฉันจะใช้แนวทางconfigparserมาตรฐานเว้นแต่จะมีเหตุผลที่น่าสนใจที่จะใช้รูปแบบอื่น

เขียนไฟล์ดังนี้:

# 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('config1.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
ใน python 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 Basic

ดูเหมือนจะไม่ถูกใช้เลยสำหรับไฟล์คอนฟิกูเรชันโดยชุมชน 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 ('section', 'option', [1,2,3]) หลังจากบันทึกและอ่าน config จะเป็น CP.get ('section', 'option') => '1, 2, 3'
Gnudiff

10

หากคุณต้องการใช้บางอย่างเช่นไฟล์ INI เพื่อเก็บการตั้งค่าให้พิจารณาใช้configparserซึ่งโหลดคู่ค่าคีย์จากไฟล์ข้อความและสามารถเขียนกลับไปที่ไฟล์ได้อย่างง่ายดาย

ไฟล์ INI มีรูปแบบ:

[Section]
key = value
key with spaces = somevalue

2

บันทึกและโหลดพจนานุกรม คุณจะมีคีย์ค่าและจำนวนคีย์คู่ค่าโดยพลการ


ฉันสามารถใช้ refactoring กับสิ่งนี้ได้หรือไม่?
ตำนาน


-3

ลองใช้cfg4py :

  1. การออกแบบตามลำดับชั้นรองรับ env หลายชั้นดังนั้นอย่าทำให้การตั้งค่า dev ยุ่งกับการตั้งค่าไซต์การผลิต
  2. รหัสเสร็จสิ้น Cfg4py จะแปลง yaml ของคุณเป็นคลาส python จากนั้นการเติมโค้ดจะพร้อมใช้งานในขณะที่คุณพิมพ์โค้ดของคุณ
  3. อื่น ๆ อีกมากมาย..

การปฏิเสธความรับผิด: ฉันเป็นผู้เขียนโมดูลนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.