पायथन 3 के साथ आईएनआई फ़ाइल कैसे पढ़ें और लिखें?


118

मुझे Python3 के साथ एक INI फ़ाइल पढ़ने, लिखने और बनाने की आवश्यकता है।

FILE.INI

default_path = "/path/name/"
default_file = "file.txt"

पायथन फ़ाइल:

#    Read file and and create if it not exists
config = iniFile( 'FILE.INI' )

#    Get "default_path"
config.default_path

#    Print (string)/path/name
print config.default_path

#    Create or Update
config.append( 'default_path', 'var/shared/' )
config.append( 'default_message', 'Hey! help me!!' )

अद्यतन की गई फ़ाइल

default_path    = "var/shared/"
default_file    = "file.txt"
default_message = "Hey! help me!!"


2
वास्तव में, कैसे stackoverflow.com/a/3220891/716118 के बारे में ?

एक उचित ini फ़ाइल की तरह एक अनुभाग शीर्षक की आवश्यकता है [foobar]
मार्टिन थोमा

जवाबों:


148

यह कुछ के साथ शुरू हो सकता है:

import configparser

config = configparser.ConfigParser()
config.read('FILE.INI')
print(config['DEFAULT']['path'])     # -> "/path/name/"
config['DEFAULT']['path'] = '/var/shared/'    # update
config['DEFAULT']['default_message'] = 'Hey! help me!!'   # create

with open('FILE.INI', 'w') as configfile:    # save
    config.write(configfile)

आप आधिकारिक कॉन्फिगरेशन प्रलेखन पर अधिक पा सकते हैं ।


4
configparser.MissingSectionHeaderErrorउचित अनुभाग हेडर के बिना प्रदान की गई उदाहरण फ़ाइलों का उपयोग करते समय देता है ।
जाकोका

81

यहां एक पूर्ण पढ़ा, अद्यतन और उदाहरण लिखें।

इनपुट फ़ाइल, test.ini

[section_a]
string_val = hello
bool_val = false
int_val = 11
pi_val = 3.14

कार्य कोड।

try:
    from configparser import ConfigParser
except ImportError:
    from ConfigParser import ConfigParser  # ver. < 3.0

# instantiate
config = ConfigParser()

# parse existing file
config.read('test.ini')

# read values from a section
string_val = config.get('section_a', 'string_val')
bool_val = config.getboolean('section_a', 'bool_val')
int_val = config.getint('section_a', 'int_val')
float_val = config.getfloat('section_a', 'pi_val')

# update existing value
config.set('section_a', 'string_val', 'world')

# add a new section and some values
config.add_section('section_b')
config.set('section_b', 'meal_val', 'spam')
config.set('section_b', 'not_found_val', '404')

# save to a file
with open('test_update.ini', 'w') as configfile:
    config.write(configfile)

आउटपुट फ़ाइल, test_update.ini

[section_a]
string_val = world
bool_val = false
int_val = 11
pi_val = 3.14

[section_b]
meal_val = spam
not_found_val = 404

मूल इनपुट फ़ाइल अछूती रहती है।


मेरे Python 3.7 सिस्टम पर, "config.set ('सेक्शन_b', 'not_found_val', 404)" को "config.set ('सेक्शन_ब', 'not_found_val, str (404))" "में बदलना होगा क्योंकि "सेट" के लिए मानकों को तार होना चाहिए। बहुत बढ़िया उदाहरण, धन्यवाद!
श्री एड।

ऐसा लगता है कि read विधि अब पढ़ने वाली फ़ाइलों / फ़ाइल की सूची लौटाती है, लेकिन सामग्री नहीं
YTerle


5

मानक को ConfigParserसामान्य रूप से एक्सेस की आवश्यकता होती है config['section_name']['key'], जो कि मज़ेदार नहीं है। थोड़ा संशोधन विशेषता पहुंच प्रदान कर सकता है:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

AttrDictएक ऐसा वर्ग है, dictजिसमें से शब्दकोश कुंजी और विशेषता पहुँच दोनों के माध्यम से पहुँच की अनुमति मिलती है: इसका मतलब हैa.x is a['x']

हम इस श्रेणी का उपयोग कर सकते हैं ConfigParser:

config = configparser.ConfigParser(dict_type=AttrDict)
config.read('application.ini')

और अब हम application.iniसाथ हैं:

[general]
key = value

जैसा

>>> config._sections.general.key
'value'

6
अच्छी चाल, लेकिन इस विधि के उपयोगकर्ताओं को ध्यान रखना चाहिए, कि जब config._sections.general.key = "3"इस तरह से प्रवेश करना विन्यास विकल्प के आंतरिक मूल्य को बदल नहीं रहा है और इसलिए इसका उपयोग केवल पढ़ने के लिए ही किया जा सकता है। यदि .read()कमांड के बाद कॉन्फ़िगरेशन को बढ़ाया या बदला गया है (कुछ वर्गों के लिए विकल्प, मूल्य जोड़े जोड़ें, -> जो प्रक्षेप करता है जो बहुत महत्वपूर्ण हो सकता है) इस एक्सेस विधि का उपयोग नहीं किया जाना चाहिए! इसके अलावा config._sections["section"]["opt"]निजी परिधि में किसी भी तरह की पहुंच और कच्चे मूल्यों की वापसी होती है!
गैब्रियल

5

ConfigObj कॉन्फिगरेशन का एक अच्छा विकल्प है जो बहुत अधिक लचीलापन प्रदान करता है:

  • नेस्टेड सेक्शन (उपखंड), किसी भी स्तर पर
  • सूची मूल्यों
  • एकाधिक लाइन मान
  • स्ट्रिंग प्रक्षेप (प्रतिस्थापन)
  • स्वत: प्रकार की जाँच / रूपांतरण दोहराया वर्गों और डिफ़ॉल्ट मानों की अनुमति सहित एक शक्तिशाली सत्यापन प्रणाली के साथ एकीकृत
  • कॉन्फ़िगरेशन फ़ाइलों को लिखते समय, कॉन्फ़िगोज़ सभी टिप्पणियों और सदस्यों और वर्गों के आदेश को संरक्षित करता है
  • कॉन्फ़िगरेशन फ़ाइलों के साथ काम करने के लिए कई उपयोगी तरीके और विकल्प (जैसे 'पुनः लोड' विधि)
  • पूर्ण यूनिकोड समर्थन

इसमें कुछ ड्रा बैक हैं:

  • आप सीमांकक सेट नहीं कर सकते, यह होना चाहिए =... ( पुल अनुरोध )
  • आपके पास खाली मान नहीं हो सकते हैं, ठीक है, लेकिन आप पसंद कर सकते हैं: fuabr =केवल इसके बजाय fubarजो अजीब और गलत दिखता है।

1
सरथ्रियन सही है, कॉन्फ़िगरओबज जाने का तरीका है यदि आप फ़ाइल में टिप्पणी और मूल फ़ाइल के रूप में अनुभाग क्रम में रखना चाहते हैं। कॉन्फिगरेशन आपकी टिप्पणियों को स्पष्ट कर देगा और कुछ बिंदु पर ऑर्डर को स्क्रैम्बल भी करेगा।
Arise

1

मेरे backup_settings.ini फ़ाइल में सामग्री

[Settings]
year = 2020

पढ़ने के लिए अजगर कोड

import configparser
config = configparser.ConfigParser()
config.read('backup_settings.ini') #path of your .ini file
year = config.get("Settings","year") 
print(year)

लिखने या अपडेट करने के लिए

from pathlib import Path
import configparser
myfile = Path('backup_settings.ini')  #Path of your .ini file
config.read(myfile)
config.set('Settings', 'year','2050') #Updating existing entry 
config.set('Settings', 'day','sunday') #Writing new entry
config.write(myfile.open("w"))

उत्पादन

[Settings]
year = 2050
day = sunday
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.