Python3 ile INI dosyası nasıl okunur ve yazılır?


118

Python3 ile bir INI dosyası okumam, yazmam ve oluşturmam gerekiyor.

FILE.INI

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

Python Dosyası:

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

GÜNCELLENMİŞ FILE.INI

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


2

uygun bir ini dosyası gibi bir bölüm başlığına ihtiyaç duyar [foobar].
Martin Thoma

Yanıtlar:


148

Bu, başlamak için bir şey olabilir:

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)

Resmi yapılandırma ayrıştırıcı belgelerinde daha fazlasını bulabilirsiniz .


4
configparser.MissingSectionHeaderErrorSağlanan örnek dosyaları uygun bölüm başlıkları olmadan kullanırken verir .
Jaakko

81

İşte eksiksiz bir okuma, güncelleme ve yazma örneği.

Giriş dosyası, test.ini

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

Çalışma kodu.

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)

Çıkış dosyası, 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

Orijinal girdi dosyası dokunulmadan kalır.


Python 3.7 sistemimde, "config.set ('section_b', 'not_found_val', 404)" satırının "config.set ('section_b', 'not_found_val', str (404))" olarak değiştirilmesi gerekiyordu çünkü "set" için parametreler dizge olmalıdır. Mükemmel örnek, teşekkürler!
Mr Ed

Görünüşe göre read yöntem artık okunan dosya / dosya listesi döndürüyor, ancak içeriği değil
YTerle


5

Standart ConfigParsernormal olarak erişim gerektirir config['section_name']['key'], bu da eğlenceli değildir. Küçük bir değişiklik öznitelik erişimi sağlayabilir:

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

AttrDictdicthem sözlük anahtarları hem de öznitelik erişimi yoluyla erişime izin veren türetilmiş bir sınıftır :a.x is a['x']

Bu sınıfı şunlarda kullanabiliriz ConfigParser:

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

ve şimdi application.inişununla anlıyoruz :

[general]
key = value

gibi

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

6
güzel bir numara, ancak bu yöntemin kullanıcıları, bu şekilde erişirken config._sections.general.key = "3", yapılandırma seçeneğinin dahili değerini değiştirmediğine ve bu nedenle yalnızca salt okunur erişim için kullanılabileceğine dikkat etmelidir . Komuttan sonra .read()yapılandırma genişletilirse veya değiştirilirse (seçenekler ekleyin, bazı bölümler için değer çiftleri, -> çok önemli olabilecek enterpolasyon yapar) bu erişim yöntemi kullanılmamalıdır! Ayrıca config._sections["section"]["opt"]özel olan herhangi bir erişim, enterpolasyonu atlatır ve ham değerleri döndürür!
Gabriel

5

ConfigObj , çok daha fazla esneklik sunan ConfigParser'a iyi bir alternatiftir:

  • İç içe bölümler (alt bölümler), herhangi bir seviyeye
  • Değerleri listeleyin
  • Birden çok satır değeri
  • Dize enterpolasyonu (ikame)
  • Otomatik tip kontrolü / dönüşüm tekrarlanan bölümleri içeren ve varsayılan değerlere izin veren güçlü bir doğrulama sistemi ile entegre edilmiştir
  • Yapılandırma dosyalarını yazarken, ConfigObj tüm yorumları ve üyelerin ve bölümlerin sırasını korur
  • Yapılandırma dosyalarıyla çalışmak için birçok yararlı yöntem ve seçenek ('yeniden yükleme' yöntemi gibi)
  • Tam Unicode desteği

Bazı dezavantajları var:

  • Sınırlayıcıyı ayarlayamazsınız, bu =… olmalıdır ( çekme isteği )
  • Boş değerlere sahip olamazsınız, yapabilirsin ama beğenilmiş görünüyorlar : fuabr =sadece fubargarip ve yanlış görünen yerine .

1
Sardathrion haklı, ConfigObj, yorumları dosyadaki ve bölüm sırasını orijinal dosyadaki gibi tutmak istiyorsanız gitmenin yoludur. ConfigParser sadece yorumlarınızı temizleyecek ve ayrıca bir noktada sıralamayı karıştıracaktır.
Kalk

2

Benim de içeriği backup_settings.ini dosyası

[Settings]
year = 2020

okumak için python kodu

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

yazmak veya güncellemek için

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

çıktı

[Settings]
year = 2050
day = sunday

Bu bir cazibe olarak çalışıyor ve temiz!
Rodrigo.A92
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.