Как читать и писать файл INI с помощью Python3?


119

Мне нужно прочитать, написать и создать файл 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!!' )

ОБНОВЛЕННЫЙ FILE.INI

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)

Вы можете найти больше в официальной документации configparser .


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))», потому что параметры для "набора" должны быть строками. Отличный пример, спасибо!
Мистер Эд

похоже, что 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 - хорошая альтернатива ConfigParser, предлагающая гораздо большую гибкость:

  • Вложенные разделы (подразделы) любого уровня
  • Значения списка
  • Многострочные значения
  • Строчная интерполяция (подстановка)
  • Интегрирован с мощной системой проверки, включая автоматическую проверку типов / преобразование повторяющихся разделов и возможность значений по умолчанию
  • При записи файлов конфигурации ConfigObj сохраняет все комментарии и порядок элементов и разделов.
  • Множество полезных методов и опций для работы с файлами конфигурации (например, метод перезагрузки)
  • Полная поддержка Unicode

У него есть недостатки:

  • Вы не можете установить разделитель, он должен быть =… ( запрос на перенос )
  • У вас не может быть пустых значений, ну, вы можете, но они выглядят понравившимися: fuabr =вместо того, fubarчто выглядит странно и неправильно.

1
Сардатрион прав, ConfigObj - это то, что вам нужно, если вы хотите сохранить комментарии в файле и порядок разделов, как в исходном файле. ConfigParser просто очистит ваши комментарии и в какой-то момент также зашифрует порядок.
Восстаньте

2

содержимое моего файла backup_settings.ini

[Settings]
year = 2020

код Python для чтения

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

Это работает как оберег и чисто!
Rodrigo.A92,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.