Як читати і записувати файл INI за допомогою Python3?


118

Мені потрібно читати, писати та створювати INI- файл із Python3.

FILE.INI

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

Файл 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!!' )

ОНОВЛЕНО ФАЙЛ.ІНІ

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


2
Насправді, як щодо stackoverflow.com/a/3220891/716118 ?
voithos

належний файл 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 ('section_b', 'not_found_val', 404)" потрібно було змінити на "config.set ('section_b', 'not_found_val', str (404))", оскільки Параметри для "set" повинні бути рядками. Відмінний приклад, дякую!
Містер Ед

виглядає як 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"не змінювалося внутрішнє значення параметра config і тому його можна використовувати лише для доступу лише для читання. Якщо після .read()команди конфігурація буде розширена або змінена (додайте параметри, пари значень для деяких розділів, -> що робить інтерполяцію, що може бути дуже важливим), цей метод доступу не слід використовувати! Також будь-який доступ, до config._sections["section"]["opt"]якого є приватний, обходить інтерполяцію та повертає вихідні значення!
Габріель

5

ConfigObj - це хороша альтернатива ConfigParser, яка пропонує набагато більшу гнучкість:

  • Вкладені розділи (підрозділи) будь-якого рівня
  • Перерахуйте значення
  • Кілька значень рядка
  • Інтерполяція рядків (заміна)
  • Інтегрований з потужною системою перевірки, що включає автоматичну перевірку типу / перетворення повторних розділів та дозволяє значення за замовчуванням
  • При написанні конфігураційних файлів ConfigObj зберігає всі коментарі та порядок членів та розділів
  • Багато корисних методів та варіантів роботи з файлами конфігурації (наприклад, метод 'reload')
  • Повна підтримка Unicode

Він має кілька зворотних боків:

  • Ви не можете встановити роздільник, він повинен бути =... ( витягнути запит )
  • Ви не можете мати порожні значення, але ви можете, але вони виглядали схоже: fuabr =замість того, fubarщо виглядає дивно і неправильно.

1
Sardathrion вірно, ConfigObj - це шлях, якщо ви хочете зберегти коментарі у файлі та порядку розділу, як у вихідному файлі. ConfigParser просто очистить ваші коментарі, а також сканує замовлення в якийсь момент.
Встань

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 та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.