Документация Python неофициальный перевод
Содержание страницы

13.2. ConfigParser – Парсер конфигурационных файловConfigParser – Configuration file parser

Примечание

Модуль ConfigParser переименован в configparser в Python 3. Инструмент 2to3 автоматически адаптирует импорты при преобразовании исходного кода в Python 3.

Этот модуль определяет класс ConfigParser. Класс ConfigParser реализует базовый язык парсинга файлов конфигурации, который предоставляет структуру, похожую на ту, что встречается в INI-файлах Microsoft Windows. Его можно использовать для написания программ на Python, которые легко настраиваются конечными пользователями.

Примечание

Эта библиотека не интерпретирует и не записывает префиксы типов значений, используемые в расширенной версии синтаксиса INI из реестра Windows.

См. также

Модуль shlex

Поддержка создания мини-языков, подобных командным оболочкам Unix, которые можно использовать в качестве альтернативного формата для файлов конфигурации приложений.

Модуль json

Модуль json реализует подмножество синтаксиса JavaScript, которое также можно использовать для этой цели.

Файл конфигурации состоит из секций, возглавляемых заголовком [section], за которыми следуют записи name: value, с продолжениями в стиле RFC 822 (см. раздел 3.1.1, «LONG HEADER FIELDS»); также принимается name=value. Обратите внимание, что начальные пробелы удаляются из значений. Необязательные значения могут содержать строки форматирования, которые ссылаются на другие значения в той же секции или значения в специальной секции DEFAULT. Дополнительные значения по умолчанию можно задать при инициализации и получении. Строки, начинающиеся с '#' или ';', игнорируются и могут использоваться для комментариев.

Файлы конфигурации могут содержать комментарии, помеченные специальными символами (# и ;). Комментарии могут находиться на отдельной пустой строке или вставляться в строки со значениями или именами секций. В последнем случае перед ними должен быть пробельный символ, чтобы распознаваться как комментарий. (Для обратной совместимости только ; начинает встроенный комментарий, а # – нет.)

В дополнение к основной функциональности, SafeConfigParser поддерживает интерполяцию. Это означает, что значения могут содержать строки форматирования, которые ссылаются на другие значения в той же секции или значения в специальной секции DEFAULT. Дополнительные значения по умолчанию можно задать при инициализации.

Например:

[My Section]
foodir: %(dir)s/whatever
dir=frob
long: this value continues
   in the next line

разрешает %(dir)s в значение dir (в данном случае frob). Все раскрытия ссылок выполняются по требованию.

Значения по умолчанию можно задать, передав их в конструктор ConfigParser в виде словаря. Дополнительные значения по умолчанию можно передать в метод get(), который переопределит все остальные.

Секции обычно хранятся во встроенном словаре. Альтернативный тип словаря можно передать конструктору ConfigParser. Например, если передан тип словаря, сортирующий ключи, секции будут отсортированы при записи, как и ключи внутри каждой секции.

class ConfigParser.RawConfigParser([defaults[, dict_type[, allow_no_value]]])

Базовый объект конфигурации. Когда задан defaults, он инициализируется в словарь внутренних значений по умолчанию. Когда задан dict_type, он будет использоваться для создания объектов-словарей для списка секций, для параметров внутри секции и для значений по умолчанию. Когда allow_no_value имеет значение true (по умолчанию: False), параметры без значений принимаются; значение, предоставляемое для них, равно None.

Этот класс не поддерживает магическое поведение интерполяции.

Все имена параметров передаются через метод optionxform(). Его реализация по умолчанию преобразует имена параметров в нижний регистр.

Новое в версии 2.3.

Изменено в версии 2.6: добавлен dict_type.

Изменено в версии 2.7: Значением по умолчанию для dict_type является collections.OrderedDict. Добавлен allow_no_value.

class ConfigParser.ConfigParser([defaults[, dict_type[, allow_no_value]]])

Производный класс от RawConfigParser, реализующий магическую интерполяцию и добавляющий необязательные аргументы к методам get() и items(). Значения в defaults должны быть подходящими для строковой интерполяции %()s. Обратите внимание, что __name__ является внутренним значением по умолчанию; его значением является имя секции, и оно переопределит любое значение, предоставленное в defaults.

Все имена параметров, используемые при интерполяции, будут передаваться через метод optionxform(), как и любая другая ссылка на имя параметра. При использовании реализации по умолчанию optionxform() значения foo %(bar)s и foo %(BAR)s эквивалентны.

Новое в версии 2.3.

Изменено в версии 2.6: добавлен dict_type.

Изменено в версии 2.7: Значением по умолчанию для dict_type является collections.OrderedDict. Добавлен allow_no_value.

class ConfigParser.SafeConfigParser([defaults[, dict_type[, allow_no_value]]])

Производный класс от ConfigParser, реализующий более разумный вариант магической интерполяции. Эта реализация также более предсказуема. Новым приложениям следует предпочитать эту версию, если им не нужна совместимость со старыми версиями Python.

Новое в версии 2.3.

Изменено в версии 2.6: добавлен dict_type.

Изменено в версии 2.7: Значением по умолчанию для dict_type является collections.OrderedDict. Добавлен allow_no_value.

exception ConfigParser.Error

Базовый класс для всех остальных исключений configparser.

exception ConfigParser.NoSectionError

Исключение, возбуждаемое, когда указанный раздел не найден.

exception ConfigParser.DuplicateSectionError

Исключение возникает, если add_section() вызывается с именем секции, которая уже существует.

exception ConfigParser.NoOptionError

Исключение возбуждается, когда указанный параметр не найден в указанной секции.

exception ConfigParser.InterpolationError

Базовый класс для исключений, возбуждаемых при возникновении проблем во время выполнения строковой интерполяции.

exception ConfigParser.InterpolationDepthError

Исключение возникает, когда строковую интерполяцию не удаётся завершить, потому что количество итераций превышает MAX_INTERPOLATION_DEPTH. Подкласс InterpolationError.

exception ConfigParser.InterpolationMissingOptionError

Исключение возникает, когда параметр, на который ссылается значение, не существует. Подкласс InterpolationError.

Новое в версии 2.3.

exception ConfigParser.InterpolationSyntaxError

Исключение возникает, когда исходный текст, в который выполняются подстановки, не соответствует требуемому синтаксису. Подкласс InterpolationError.

Новое в версии 2.3.

exception ConfigParser.MissingSectionHeaderError

Исключение возбуждается при попытке разобрать файл, не имеющий заголовков секций.

exception ConfigParser.ParsingError

Исключение, возникающее при ошибках во время разбора файла.

ConfigParser.MAX_INTERPOLATION_DEPTH

Максимальная глубина рекурсивной интерполяции для get(), когда параметр raw имеет значение false. Это актуально только для класса ConfigParser.

См. также

Модуль shlex

Поддержка создания мини-языков в стиле оболочки Unix, которые можно использовать как альтернативный формат для конфигурационных файлов приложений.

13.2.1. Объекты RawConfigParserRawConfigParser Objects

Экземпляры RawConfigParser имеют следующие методы:

RawConfigParser.defaults()

Возвращает словарь, содержащий значения по умолчанию для экземпляра.

RawConfigParser.sections()

Возвращает список доступных секций; DEFAULT не включается в список.

RawConfigParser.add_section(section)

Добавляет секцию с именем section в экземпляр. Если секция с указанным именем уже существует, возбуждается DuplicateSectionError. Если передано имя DEFAULT (или любой из его вариантов без учёта регистра), возбуждается ValueError.

RawConfigParser.has_section(section)

Указывает, присутствует ли именованный раздел в конфигурации. Раздел DEFAULT не распознан.

RawConfigParser.options(section)

Возвращает список опций, доступных в указанном разделе section.

RawConfigParser.has_option(section, option)

Если указанный раздел существует и содержит указанный параметр, вернуть True; в противном случае вернуть False.

Новое в версии 1.6.

RawConfigParser.read(filenames)

Пытается прочитать и разобрать список имён файлов, возвращая список имён файлов, которые были успешно разобраны. Если имена файлов представляет собой строку или строку Unicode, она считается именем одного файла. Если файл, указанный в имена файлов, не удаётся открыть, этот файл игнорируется. Это сделано для того, чтобы можно было указать список возможных мест расположения конфигурационных файлов (например, текущий каталог, домашний каталог пользователя и какой-либо общесистемный каталог), и все существующие конфигурационные файлы из списка будут прочитаны. Если ни один из указанных файлов не существует, экземпляр ConfigParser будет содержать пустой набор данных. Приложение, которому требуется загрузить начальные значения из файла, должно загрузить необходимый файл или файлы с помощью readfp() перед вызовом read() для любых необязательных файлов:

import ConfigParser, os

config = ConfigParser.ConfigParser()
config.readfp(open('defaults.cfg'))
config.read(['site.cfg', os.path.expanduser('~/.myapp.cfg')])

Изменено в версии 2.4: Возвращает список успешно разобранных имён файлов.

RawConfigParser.readfp(fp[, filename])

Читает и разбирает данные конфигурации из файла или файлоподобного объекта, переданного в fp (используется только метод readline()). Если filename опущен и fp имеет атрибут name, он используется для filename; по умолчанию <???>.

RawConfigParser.get(section, option)

Получает значение опции option для именованного раздела section.

RawConfigParser.getint(section, option)

Удобный метод, который приводит опцию option в указанном разделе section к целому числу.

RawConfigParser.getfloat(section, option)

Удобный метод, который приводит опцию option в указанном разделе section к числу с плавающей точкой.

RawConfigParser.getboolean(section, option)

Удобный метод, который преобразует параметр в указанном разделе в логическое значение. Обратите внимание, что допустимыми значениями параметра являются "1", "yes", "true" и "on", которые заставляют этот метод возвращать True, а также "0", "no", "false" и "off" – которые заставляют его возвращать False. Эти строковые значения проверяются без учёта регистра. Любое другое значение приведёт к возбуждению ValueError.

RawConfigParser.items(section)

Возвращает список пар (name, value) для каждого параметра в указанном разделе.

RawConfigParser.set(section, option, value)

Если указанный раздел существует, устанавливает указанный параметр в заданное значение; в противном случае возбуждает NoSectionError. Хотя для внутреннего хранения нестроковых значений можно использовать RawConfigParser (или ConfigParser с параметром raw, установленным в true), полная функциональность (включая интерполяцию и вывод в файлы) достигается только при использовании строковых значений.

Новое в версии 1.6.

RawConfigParser.write(fileobject)

Записывает представление конфигурации в указанный файловый объект. Это представление может быть разобрано при будущем вызове read().

Новое в версии 1.6.

RawConfigParser.remove_option(section, option)

Удаляет указанный параметр из указанного раздела. Если раздел не существует, возбуждает NoSectionError. Если параметр существовал и был удалён, возвращает True; в противном случае возвращает False.

Новое в версии 1.6.

RawConfigParser.remove_section(section)

Удаляет указанный раздел из конфигурации. Если раздел на самом деле существовал, возвращает True. В противном случае возвращает False.

RawConfigParser.optionxform(option)

Преобразует имя опции option, которое встречается во входном файле или передаётся клиентским кодом, в форму, которая должна использоваться во внутренних структурах. Реализация по умолчанию возвращает версию option в нижнем регистре; подклассы могут переопределить это, или клиентский код может установить атрибут с таким именем на экземплярах для изменения этого поведения.

Для использования этого метода не обязательно наследовать ConfigParser; можно также переустановить его в экземпляре, передав функцию, принимающую строковый аргумент. Например, установка его в str сделает имена параметров чувствительными к регистру:

cfgparser = ConfigParser()
...
cfgparser.optionxform = str

Обратите внимание, что при чтении конфигурационных файлов пробельные символы вокруг имён параметров удаляются перед вызовом optionxform().

13.2.2. Объекты ConfigParserConfigParser Objects

Класс ConfigParser расширяет некоторые методы интерфейса RawConfigParser, добавляя несколько необязательных аргументов.

ConfigParser.get(section, option[, raw[, vars]])

Получает значение опции для указанного раздела. Если vars передан, он должен быть словарём. Поиск опции выполняется в vars (если передан), разделе и значениях по умолчанию в указанном порядке.

Все '%' подстановки раскрываются в возвращаемых значениях, если только аргумент raw не равен true. Значения ключей подстановки ищутся так же, как и опция.

ConfigParser.items(section[, raw[, vars]])

Возвращает список пар (name, value) для каждого параметра в указанном разделе. Необязательные аргументы имеют тот же смысл, что и для метода get().

Новое в версии 2.3.

13.2.3. Объекты SafeConfigParserSafeConfigParser Objects

Класс SafeConfigParser реализует тот же расширенный интерфейс, что и ConfigParser, со следующим дополнением:

SafeConfigParser.set(section, option, value)

Если указанная секция существует, устанавливает заданную опцию в указанное значение; в противном случае вызывается NoSectionError. значение должно быть строкой (str или unicode); если нет, вызывается TypeError.

Новое в версии 2.4.

13.2.4. ПримерыExamples

Пример записи в файл конфигурации:

import ConfigParser

config = ConfigParser.RawConfigParser()

# При добавлении разделов или элементов добавляйте их в обратном порядке
# как они должны отображаться в реальном файле.
# Кроме того, обратите внимание, что использование RawConfigParser и raw
# режима соответствующих функций set ConfigParser позволяет присваивать
# нестроковые значения ключам внутри, но вы получите ошибку
# при попытке записи в файл или при получении в необработанном
# режиме. SafeConfigParser не допускает таких присваиваний.
config.add_section('Section1')
config.set('Section1', 'an_int', '15')
config.set('Section1', 'a_bool', 'true')
config.set('Section1', 'a_float', '3.1415')
config.set('Section1', 'baz', 'fun')
config.set('Section1', 'bar', 'Python')
config.set('Section1', 'foo', '%(bar)s is %(baz)s!')

# Записываем наш конфигурационный файл в 'example.cfg'
with open('example.cfg', 'wb') as configfile:
    config.write(configfile)

Пример повторного чтения файла конфигурации:

import ConfigParser

config = ConfigParser.RawConfigParser()
config.read('example.cfg')

# getfloat() вызывает исключение, если значение не является float.
# getint() и getboolean() делают то же самое для своих типов.
a_float = config.getfloat('Section1', 'a_float')
an_int = config.getint('Section1', 'an_int')
print a_float + an_int

# Обратите внимание, что следующий вывод не интерполирует '%(bar)s' или '%(baz)s'.
# Это потому, что мы используем RawConfigParser().
if config.getboolean('Section1', 'a_bool'):
    print config.get('Section1', 'foo')

Для получения интерполяции необходимо использовать ConfigParser или SafeConfigParser:

import ConfigParser

config = ConfigParser.ConfigParser()
config.read('example.cfg')

# Установите третий необязательный аргумент get в 1, если вы хотите использовать raw-режим.
print config.get('Section1', 'foo', 0)  # -> "Python – это весело!"
print config.get('Section1', 'foo', 1)  # -> "%(bar)s – это %(baz)s!"

# Необязательный четвертый аргумент – это словарь с элементами, которые будут принимать
# приоритет при интерполяции.
print config.get('Section1', 'foo', 0, {'bar': 'Documentation',
                                        'baz': 'evil'})

Значения по умолчанию доступны во всех трёх типах ConfigParser. Они используются в подстановке, если используемая опция не определена в другом месте.

import ConfigParser

# Новый экземпляр с 'bar' и 'baz', по умолчанию равными 'Life' и 'hard' соответственно.
config = ConfigParser.SafeConfigParser({'bar': 'Life', 'baz': 'hard'})
config.read('example.cfg')

print config.get('Section1', 'foo')  # -> "Python – это весело!"
config.remove_option('Section1', 'bar')
config.remove_option('Section1', 'baz')
print config.get('Section1', 'foo')  # -> "Жизнь тяжела!"

Функция opt_move ниже позволяет перемещать опции между секциями:

def opt_move(config, section1, section2, option):
    try:
        config.set(section2, option, config.get(section1, option, 1))
    except ConfigParser.NoSectionError:
        # Создать несуществующий раздел
        config.add_section(section2)
        opt_move(config, section1, section2, option)
    else:
        config.remove_option(section1, option)

Известно, что некоторые конфигурационные файлы содержат настройки без значений, но в остальном соответствуют синтаксису, поддерживаемому ConfigParser. Параметр allow_no_value конструктора можно использовать, чтобы указать, что такие значения следует принимать:

>>> import ConfigParser
>>> import io

>>> sample_config = """
... [mysqld]
... user = mysql
... pid-file = /var/run/mysqld/mysqld.pid
... skip-external-locking
... old_passwords = 1
... skip-bdb
... skip-innodb
... """
>>> config = ConfigParser.RawConfigParser(allow_no_value=True)
>>> config.readfp(io.BytesIO(sample_config))

>>> # Настройки со значениями обрабатываются как и раньше:
>>> config.get("mysqld", "user")
'mysql'

>>> # Настройки без значений дают None:
>>> config.get("mysqld", "skip-bdb")

>>> # Настройки, которые не указаны, по-прежнему вызывают ошибку:
>>> config.get("mysqld", "does-not-exist")
Traceback (most recent call last):
  ...
ConfigParser.NoOptionError: No option 'does-not-exist' in section: 'mysqld'