পাইথন: আপনি কীভাবে একটি সাধারণ সেটিংস / কনফিগারেশন ফাইল সংরক্ষণ করবেন?


106

আমি কেয়ার করি না এটা যদি JSON, pickle, YAML, অথবা যা খুশি।

অন্য যে সমস্ত বাস্তবায়ন আমি দেখেছি তা ফরওয়ার্ডগুলি সামঞ্জস্যপূর্ণ নয়, সুতরাং যদি আমার কাছে একটি কনফিগার ফাইল থাকে তবে কোডে একটি নতুন কী যুক্ত করুন, তারপরে সেই কনফিগারেশন ফাইলটি লোড করুন, এটি ঠিক ক্রাশ হবে।

এটি করার কোনও সহজ উপায় আছে?


4
আমি বিশ্বাস করি .iniযে configparserমডিউলটির পছন্দসই বিন্যাসটি ব্যবহার করা আপনার যা করা উচিত তা করা উচিত।
বাকুরিউ

15
আমার উত্তরটি সঠিক হিসাবে নির্বাচন করার কোনও সুযোগ আছে?
গ্রিম স্টুয়ার্ট

উত্তর:


199

পাইথনে কনফিগারেশন ফাইল

প্রয়োজনীয় ফাইল ফর্ম্যাটটির উপর নির্ভর করে এটি করার বিভিন্ন উপায় রয়েছে।

কনফিগার পার্সার [.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')

জেএসএন [.জসন ফর্ম্যাট]

জেএসএন ডেটা খুব জটিল হতে পারে এবং অত্যন্ত পোর্টেবল হওয়ার সুবিধাও রয়েছে।

একটি ফাইলে ডেটা লিখুন:

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 উদাহরণ প্রদান করা হয় এই উত্তর । আরও বিশদ পাইয়ামএল ওয়েবসাইটে পাওয়া যাবে ।


8
অজগর 3 from configparser import ConfigParser config = ConfigParser()
ব্যবহারকারী 3148949

12

কনফিগারপার্সার বেসিক উদাহরণ

ফাইলটি লোড এবং এটির মতো ব্যবহার করা যেতে পারে:

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

এক্সএমএল বেসিক উদাহরণ

পাইথন সম্প্রদায়ের কনফিগারেশন ফাইলগুলির জন্য মোটেও ব্যবহার করা হবে না বলে মনে হচ্ছে। তবে এক্সএমএলকে বিশ্লেষণ / লেখা সহজ এবং পাইথনের সাথে এটি করার প্রচুর সম্ভাবনা রয়েছে। একটি হ'ল বিউটিউশনসপ:

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>
    <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- স্টাইলের ফর্ম্যাট।
এরিক ক্রামার

এটি লক্ষ করা উচিত যে কমপক্ষে কনফিগার পার্সারের পাইথন 2 সংস্করণটি নিঃশব্দে সঞ্চিত তালিকাটি পড়ার পরে স্ট্রিংয়ে রূপান্তর করবে। অর্থাৎ। সিপি.সেট ('বিভাগ', 'বিকল্প', [1,2,3]) সংরক্ষণ এবং পাঠের কনফিগারেশন পরে সিপি.জেট হবে ('বিভাগ', 'বিকল্প') => '1, 2, 3'
গ্নুডিফ

10

যদি আপনি সেটিংস ধরে রাখতে কোনও আইএনআই ফাইলের মতো কিছু ব্যবহার করতে চান তবে কনফিগার পার্সার ব্যবহার করে বিবেচনা করুন যা কোনও পাঠ্য ফাইল থেকে মূল মান জোড়া লোড করে এবং সহজেই ফাইলটিতে আবার লিখতে পারে।

আইএনআই ফাইলের ফর্ম্যাট রয়েছে:

[Section]
key = value
key with spaces = somevalue

2

একটি অভিধান সংরক্ষণ করুন এবং লোড করুন। আপনার কাছে স্বেচ্ছাসেবক কী, মান এবং স্বেচ্ছাসেবী সংখ্যা, মান জোড়া থাকবে have


আমি কি এর সাথে রিফ্যাক্টরিং ব্যবহার করতে পারি?
লরে


-3

সিএফজি 4পি ব্যবহার করে দেখুন :

  1. হাইয়ারচিচাল ডিজাইন, মাল্টিপল এনভিভি সমর্থিত, তাই কখনও প্রোডাকশন সাইটের সেটিংসের সাথে ডেভ সেটিংসে গণ্ডগোল হবে না।
  2. কোড সমাপ্তি। সিএফজি 4পি আপনার ইয়ামলটিকে একটি অজগর শ্রেণিতে রূপান্তরিত করবে, তারপরে আপনি আপনার কোড টাইপ করার সময় কোড সমাপ্তি উপলব্ধ।
  3. আরো অনেক..

অস্বীকৃতি: আমি এই মডিউলটির লেখক

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.