Bagaimana cara membaca dan menulis file INI dengan Python3?


118

Saya perlu membaca, menulis dan membuat file INI dengan Python3.

FILE.INI

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

File Python:

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

FILE.INI DIPERBARUI

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


2
Sebenarnya, bagaimana dengan stackoverflow.com/a/3220891/716118 ?
voithos

file ini yang tepat membutuhkan judul bagian seperti [foobar].
Martin Thoma

Jawaban:


148

Ini bisa menjadi sesuatu untuk memulai:

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)

Anda dapat menemukan lebih lanjut di dokumentasi configparser resmi .


4
Memberikan configparser.MissingSectionHeaderErrorsaat menggunakan file contoh yang disediakan tanpa header bagian yang sesuai.
Jaakko

81

Berikut adalah contoh lengkap membaca, memperbarui, dan menulis.

File masukan, test.ini

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

Kode kerja.

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)

File keluaran, 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

File masukan asli tetap tidak tersentuh.


Pada sistem Python 3.7 saya, baris "config.set ('section_b', 'not_found_val', 404)" harus diubah menjadi "config.set ('section_b', 'not_found_val', str (404))" karena parameter untuk "set" harus berupa string. Contoh yang bagus, terima kasih!
Tuan Ed

Sepertinya read metode ini sekarang mengembalikan daftar file / file yang telah dibaca, tetapi bukan kontennya
YTerle


5

Standar ConfigParserbiasanya membutuhkan akses via config['section_name']['key'], yang tidak menyenangkan. Sedikit modifikasi dapat memberikan akses atribut:

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

AttrDictadalah kelas turunan dictyang memungkinkan akses melalui kunci kamus dan akses atribut: itu artinyaa.x is a['x']

Kita dapat menggunakan kelas ini di ConfigParser:

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

dan sekarang kita mendapatkan application.ini:

[general]
key = value

sebagai

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

6
trik yang bagus, tetapi pengguna metode ini harus berhati-hati, bahwa saat mengakses seperti config._sections.general.key = "3"ini tidak mengubah nilai internal opsi konfigurasi dan oleh karena itu hanya dapat digunakan untuk akses hanya baca. Jika setelah .read()perintah konfigurasi diperpanjang atau diubah (tambahkan opsi, pasangan nilai untuk beberapa bagian, -> yang melakukan interpolasi yang mungkin sangat penting) metode akses ini tidak boleh digunakan! Juga akses apa pun config._sections["section"]["opt"]yang privatnya mengelak interpolasi dan mengembalikan nilai mentah!
Gabriel

5

ConfigObj adalah alternatif yang baik untuk ConfigParser yang menawarkan lebih banyak fleksibilitas:

  • Bagian bersarang (subbagian), ke tingkat mana pun
  • Cantumkan nilai
  • Beberapa nilai garis
  • Interpolasi string (substitusi)
  • Terintegrasi dengan sistem validasi yang kuat termasuk pemeriksaan tipe otomatis / konversi bagian berulang dan memungkinkan nilai default
  • Saat menulis file konfigurasi, ConfigObj mempertahankan semua komentar dan urutan anggota dan bagian
  • Banyak metode dan opsi yang berguna untuk bekerja dengan file konfigurasi (seperti metode 'reload')
  • Dukungan Unicode penuh

Ini memiliki beberapa kekurangan:

  • Anda tidak dapat mengatur pembatas, itu harus =… ( pull request )
  • Anda tidak boleh memiliki nilai-nilai kosong, Anda bisa tetapi mereka terlihat disukai: fuabr =alih-alih hanya fubaryang terlihat aneh dan salah.

1
Sardathrion benar, ConfigObj adalah cara yang harus dilakukan jika Anda ingin menyimpan komentar di file dan urutan bagian seperti di file asli. ConfigParser hanya akan menghapus komentar Anda dan juga akan mengacak pesanan di beberapa titik.
Bangkitlah

2

konten di file backup_settings.ini saya

[Settings]
year = 2020

kode python untuk membaca

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

untuk menulis atau memperbarui

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

keluaran

[Settings]
year = 2050
day = sunday

Ini berfungsi sebagai pesona dan bersih!
Rodrigo.A92
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.