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

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

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

Примечание

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

См. также

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

13.2.1. Быстрый стартQuick Start

Рассмотрим простейший конфигурационный файл, который выглядит так:

[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes

[bitbucket.org]
User = hg

[topsecret.server.com]
Port = 50022
ForwardX11 = no

Структура INI-файлов описана в следующем разделе. По сути, файл состоит из разделов, каждый из которых содержит ключи со значениями. Классы configparser могут читать и записывать такие файлы. Начнём с программного создания приведённого выше конфигурационного файла.

>>> import configparser
>>> config = configparser.ConfigParser()
>>> config['DEFAULT'] = {'ServerAliveInterval': '45',
...                      'Compression': 'yes',
...                      'CompressionLevel': '9'}
>>> config['bitbucket.org'] = {}
>>> config['bitbucket.org']['User'] = 'hg'
>>> config['topsecret.server.com'] = {}
>>> topsecret = config['topsecret.server.com']
>>> topsecret['Port'] = '50022'     # изменяет парсер
>>> topsecret['ForwardX11'] = 'no'  # то же самое
>>> config['DEFAULT']['ForwardX11'] = 'yes'
>>> with open('example.ini', 'w') as configfile:
...   config.write(configfile)
...

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

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

>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.sections()
[]
>>> config.read('example.ini')
['example.ini']
>>> config.sections()
['bitbucket.org', 'topsecret.server.com']
>>> 'bitbucket.org' in config
True
>>> 'bytebong.com' in config
False
>>> config['bitbucket.org']['User']
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> topsecret = config['topsecret.server.com']
>>> topsecret['ForwardX11']
'no'
>>> topsecret['Port']
'50022'
>>> for key in config['bitbucket.org']: print(key)
...
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> config['bitbucket.org']['ForwardX11']
'yes'

Как видно выше, API довольно прост. Единственная магия заключается в разделе DEFAULT, который предоставляет значения по умолчанию для всех остальных разделов [1]. Также обратите внимание, что ключи в разделах нечувствительны к регистру и хранятся в нижнем регистре [1].

13.2.2. Поддерживаемые типы данныхSupported Datatypes

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

>>> int(topsecret['Port'])
50022
>>> float(topsecret['CompressionLevel'])
9.0

Однако извлечение логических значений не так просто. Передача значения в bool() не поможет, так как bool('False') всё равно равно True. Поэтому парсеры конфигурации также предоставляют getboolean(). Этот метод нечувствителен к регистру и распознаёт логические значения из 'yes'/'no', 'on'/'off' и '1'/'0' [1]. Например:

>>> topsecret.getboolean('ForwardX11')
False
>>> config['bitbucket.org'].getboolean('ForwardX11')
True
>>> config.getboolean('bitbucket.org', 'Compression')
True

Помимо getboolean(), парсеры конфигурации также предоставляют аналогичные методы getint() и getfloat(), но они гораздо менее полезны, поскольку для этих типов достаточно преобразования с помощью int() и float().

13.2.3. Значения по умолчаниюFallback Values

Как и со словарём, можно использовать метод get() раздела для предоставления запасных значений:

>>> topsecret.get('Port')
'50022'
>>> topsecret.get('CompressionLevel')
'9'
>>> topsecret.get('Cipher')
>>> topsecret.get('Cipher', '3des-cbc')
'3des-cbc'

Обратите внимание, что значения по умолчанию имеют приоритет над запасными значениями. Например, в нашем примере ключ 'CompressionLevel' был указан только в разделе 'DEFAULT'. Если мы попытаемся получить его из раздела 'topsecret.server.com', мы всегда получим значение по умолчанию, даже если укажем запасное:

>>> topsecret.get('CompressionLevel', '3')
'9'

Следует также знать, что метод get() на уровне парсера предоставляет пользовательский, более сложный интерфейс, сохраняемый для обратной совместимости. При использовании этого метода запасное значение можно передать через именованный аргумент fallback:

>>> config.get('bitbucket.org', 'monster',
...            fallback='No such things as monsters')
'No such things as monsters'

Тот же аргумент fallback можно использовать с методами getint(), getfloat() и getboolean(), например:

>>> 'BatchMode' in topsecret
False
>>> topsecret.getboolean('BatchMode', fallback=True)
True
>>> config['DEFAULT']['BatchMode'] = 'no'
>>> topsecret.getboolean('BatchMode', fallback=True)
False

13.2.4. Поддерживаемая структура INI-файловSupported INI File Structure

Файл конфигурации состоит из разделов, каждый из которых начинается с заголовка [section], за которым следуют записи ключ/значение, разделённые определённой строкой (по умолчанию = или : [1]). По умолчанию имена разделов чувствительны к регистру, а ключи – нет [1]. Начальные и конечные пробелы удаляются из ключей и значений. Значения могут отсутствовать, и в этом случае разделитель ключ/значение также может быть опущен. Значения также могут занимать несколько строк, если они имеют отступ глубже, чем первая строка значения. В зависимости от режима парсера пустые строки могут рассматриваться как части многострочных значений или игнорироваться.

Конфигурационные файлы могут содержать комментарии, начинающиеся с определенных символов (по умолчанию # и ; [1]). Комментарии могут располагаться на отдельной пустой строке, возможно с отступом. [1]

Например:

[Simple Values]
key=value
spaces in keys=allowed
spaces in values=allowed as well
spaces around the delimiter = obviously
you can also use : to delimit keys from values

[All Values Are Strings]
values like this: 1000000
or this: 3.14159265359
are they treated as numbers? : no
integers, floats and booleans are held as: strings
can use the API to get converted values directly: true

[Multiline Values]
chorus: I'm a lumberjack, and I'm okay
    I sleep all night and I work all day

[No Values]
key_without_value
empty string value here =

[You can use comments]
# like this
; or this

# By default only in an empty line.
# Inline comments can be harmful because they prevent users
# from using the delimiting characters as parts of values.
# That being said, this can be customized.

    [Sections Can Be Indented]
        can_values_be_as_well = True
        does_that_mean_anything_special = False
        purpose = formatting for readability
        multiline_values = are
            handled just fine as
            long as they are indented
            deeper than the first line
            of a value
        # Did I mention we can indent comments, too?

13.2.5. Интерполяция значенийInterpolation of values

В дополнение к основной функциональности ConfigParser поддерживает интерполяцию. Это означает, что значения могут быть предварительно обработаны перед возвратом из вызовов get().

class configparser.BasicInterpolation

Реализация по умолчанию, используемая ConfigParser. Она позволяет значениям содержать строки формата, которые ссылаются на другие значения в том же разделе или значения в специальном разделе по умолчанию [1]. Дополнительные значения по умолчанию могут быть предоставлены при инициализации.

Например:

[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures

В приведённом выше примере ConfigParser с interpolation, установленным в BasicInterpolation(), разрешит %(home_dir)s в значение home_dir (в данном случае /Users). %(my_dir)s в итоге будет разрешено в /Users/lumberjack. Все интерполяции выполняются по требованию, поэтому ключи, используемые в цепочке ссылок, не обязательно должны быть указаны в каком-либо определённом порядке в файле конфигурации.

При interpolation, установленном в None, парсер просто вернёт %(my_dir)s/Pictures в качестве значения my_pictures и %(home_dir)s/lumberjack в качестве значения my_dir.

class configparser.ExtendedInterpolation

Альтернативный обработчик интерполяции, реализующий более продвинутый синтаксис, используемый, например, в zc.buildout. Расширенная интерполяция использует ${section:option} для обозначения значения из другого раздела. Интерполяция может распространяться на несколько уровней. Для удобства, если часть section: опущена, интерполяция по умолчанию применяется к текущему разделу (и, возможно, к значениям по умолчанию из специального раздела).

Например, конфигурация, заданная выше с базовой интерполяцией, с расширенной интерполяцией будет выглядеть так:

[Paths]
home_dir: /Users
my_dir: ${home_dir}/lumberjack
my_pictures: ${my_dir}/Pictures

Значения из других разделов также можно получать:

[Common]
home_dir: /Users
library_dir: /Library
system_dir: /System
macports_dir: /opt/local

[Frameworks]
Python: 3.2
path: ${Common:system_dir}/Library/Frameworks/

[Arthur]
nickname: Two Sheds
last_name: Jackson
my_dir: ${Common:home_dir}/twosheds
my_pictures: ${my_dir}/Pictures
python_dir: ${Frameworks:path}/Python/Versions/${Frameworks:Python}

13.2.6. Доступ через протокол отображенияMapping Protocol Access

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

Доступ через протокол отображения – это общее название функциональности, позволяющей использовать пользовательские объекты как словари. В случае configparser реализация интерфейса отображения использует нотацию parser['section']['option'].

parser['section'] в частности возвращает прокси для данных раздела в парсере. Это означает, что значения не копируются, а берутся из исходного парсера по запросу. Что ещё более важно, при изменении значений на прокси раздела они фактически изменяются в исходном парсере.

configparser объекты ведут себя максимально близко к настоящим словарям. Интерфейс отображения полон и соответствует абстрактному базовому классу MutableMapping. Однако есть несколько отличий, которые следует учитывать:

  • По умолчанию все ключи в разделах доступны без учёта регистра [1]. Например, for option in parser["section"] возвращает только optionxform-имена ключей опций. Это означает ключи в нижнем регистре по умолчанию. В то же время для раздела, содержащего ключ 'a', оба выражения возвращают True:

    "a" in parser["section"]
    "A" in parser["section"]
    
  • Все секции также включают значения DEFAULTSECT, что означает, что .clear() для секции может не сделать секцию явно пустой. Это потому, что значения по умолчанию нельзя удалить из секции (технически их там нет). Если они были переопределены в секции, удаление приводит к тому, что значение по умолчанию снова становится видимым. Попытка удалить значение по умолчанию приводит к KeyError.

  • DEFAULTSECT не может быть удалён из парсера:

    • попытка удалить его вызывает ValueError,
    • parser.clear() оставляет его нетронутым,
    • parser.popitem() никогда не возвращает его.
  • parser.get(section, option, **kwargs) – второй аргумент не является запасным значением. Однако обратите внимание, что методы get() на уровне раздела совместимы как с протоколом отображения, так и с классическим API configparser.

  • parser.items() совместим с протоколом отображения (возвращает список пар имя_раздела, proxy_раздела, включая DEFAULTSECT). Однако этот метод также можно вызывать с аргументами: parser.items(section, raw, vars). Второй вызов возвращает список пар опция, значение для указанного раздела, со всеми развёрнутыми подстановками (если не передан raw=True).

Протокол отображения реализован поверх существующего устаревшего API, поэтому подклассы, переопределяющие исходный интерфейс, по-прежнему должны работать с отображением, как и ожидается.

13.2.7. Настройка поведения парсераCustomizing Parser Behaviour

Существует почти столько же вариантов INI-формата, сколько приложений, использующих его. configparser прилагает большие усилия для поддержки максимально разумного набора доступных стилей INI. Функциональность по умолчанию в основном обусловлена историческими причинами, и, скорее всего, потребуется настроить некоторые её возможности.

Самый распространённый способ изменить поведение конкретного анализатора конфигов – использовать параметры __init__():

  • defaults, значение по умолчанию: None

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

    Подсказка: если нужно указать значения по умолчанию для конкретного раздела, используйте read_dict() перед чтением самого файла.

  • dict_type, значение по умолчанию: collections.OrderedDict

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

    Альтернативный тип словаря можно использовать, например, для сортировки разделов и опций при обратной записи. Также можно использовать обычный словарь по соображениям производительности.

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

    >>> parser = configparser.ConfigParser()
    >>> parser.read_dict({'section1': {'key1': 'value1',
    ...                                'key2': 'value2',
    ...                                'key3': 'value3'},
    ...                   'section2': {'keyA': 'valueA',
    ...                                'keyB': 'valueB',
    ...                                'keyC': 'valueC'},
    ...                   'section3': {'foo': 'x',
    ...                                'bar': 'y',
    ...                                'baz': 'z'}
    ... })
    >>> parser.sections()
    ['section3', 'section2', 'section1']
    >>> [option for option in parser['section3']]
    ['baz', 'foo', 'bar']
    

    В таких операциях также необходимо использовать упорядоченный словарь:

    >>> from collections import OrderedDict
    >>> parser = configparser.ConfigParser()
    >>> parser.read_dict(
    ...   OrderedDict((
    ...     ('s1',
    ...      OrderedDict((
    ...        ('1', '2'),
    ...        ('3', '4'),
    ...        ('5', '6'),
    ...      ))
    ...     ),
    ...     ('s2',
    ...      OrderedDict((
    ...        ('a', 'b'),
    ...        ('c', 'd'),
    ...        ('e', 'f'),
    ...      ))
    ...     ),
    ...   ))
    ... )
    >>> parser.sections()
    ['s1', 's2']
    >>> [option for option in parser['s1']]
    ['1', '3', '5']
    >>> [option for option in parser['s2'].values()]
    ['b', 'd', 'f']
    
  • allow_no_value, значение по умолчанию: False

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

    >>> import configparser
    
    >>> sample_config = """
    ... [mysqld]
    ...   user = mysql
    ...   pid-file = /var/run/mysqld/mysqld.pid
    ...   skip-external-locking
    ...   old_passwords = 1
    ...   skip-bdb
    ...   # we don't need ACID today
    ...   skip-innodb
    ... """
    >>> config = configparser.ConfigParser(allow_no_value=True)
    >>> config.read_string(sample_config)
    
    >>> # Настройки со значениями обрабатываются как и раньше:
    >>> config["mysqld"]["user"]
    'mysql'
    
    >>> # Настройки без значений дают None:
    >>> config["mysqld"]["skip-bdb"]
    
    >>> # Настройки, которые не указаны, по-прежнему вызывают ошибку:
    >>> config["mysqld"]["does-not-exist"]
    Traceback (most recent call last):
      ...
    KeyError: 'does-not-exist'
    
  • delimiters, значение по умолчанию: ('=', ':')

    Разделители – это подстроки, которые отделяют ключи от значений в рамках секции. Первое вхождение подстроки-разделителя в строке считается разделителем. Это означает, что значения (но не ключи) могут содержать разделители.

    См. также аргумент space_around_delimiters функции ConfigParser.write().

  • comment_prefixes, значение по умолчанию: ('#', ';')

  • inline_comment_prefixes, значение по умолчанию: None

    Префиксы комментариев – это строки, указывающие на начало допустимого комментария в файле конфигурации. comment_prefixes используются только на пустых строках (возможно с отступом), тогда как inline_comment_prefixes могут использоваться после любого допустимого значения (например, названий разделов, опций и пустых строк). По умолчанию встроенные комментарии отключены, а в качестве префиксов для комментариев на всю строку используются '#' и ';'.

    Изменено в версии 3.2: В предыдущих версиях configparser поведение соответствовало comment_prefixes=('#',';') и inline_comment_prefixes=(';',).

    Обратите внимание: анализаторы конфигов не поддерживают экранирование префиксов комментариев, поэтому использование inline_comment_prefixes может помешать пользователям указывать значения опций, содержащие символы, используемые как префиксы комментариев. При сомнениях избегайте установки inline_comment_prefixes. В любом случае, единственный способ сохранить символы префиксов комментариев в начале строки в многострочных значениях – это подстановка префикса, например:

    >>> from configparser import ConfigParser, ExtendedInterpolation
    >>> parser = ConfigParser(interpolation=ExtendedInterpolation())
    >>> # можно также использовать стандартный BasicInterpolation
    >>> parser.read_string("""
    ... [DEFAULT]
    ... hash = #
    ...
    ... [hashes]
    ... shebang =
    ...   ${hash}!/usr/bin/env python
    ...   ${hash} -*- coding: utf-8 -*-
    ...
    ... extensions =
    ...   enabled_extension
    ...   another_extension
    ...   #disabled_by_comment
    ...   yet_another_extension
    ...
    ... interpolation not necessary = if # is not at line start
    ... even in multiline values = line #1
    ...   line #2
    ...   line #3
    ... """)
    >>> print(parser['hashes']['shebang'])
    
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    >>> print(parser['hashes']['extensions'])
    
    enabled_extension
    another_extension
    yet_another_extension
    >>> print(parser['hashes']['interpolation not necessary'])
    if # is not at line start
    >>> print(parser['hashes']['even in multiline values'])
    line #1
    line #2
    line #3
    
  • strict, значение по умолчанию: True

    Если установлено значение True, анализатор не допускает дублирования разделов или опций при чтении из одного источника (с помощью read_file(), read_string() или read_dict()). В новых приложениях рекомендуется использовать строгие анализаторы.

    Изменено в версии 3.2: В предыдущих версиях configparser поведение соответствовало strict=False.

  • empty_lines_in_values, значение по умолчанию: True

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

    [Section]
    key = multiline
      value with a gotcha
    
     this = is still a part of the multiline value of 'key'

    Это может быть особенно проблематично для пользователя, если он использует пропорциональный шрифт для редактирования файла. Поэтому, если вашему приложению не требуются значения с пустыми строками, стоит запретить их. Это заставит пустые строки каждый раз разделять ключи. В приведённом выше примере получилось бы два ключа: key и this.

  • default_section, значение по умолчанию: configparser.DEFAULTSECT (то есть "DEFAULT")

    Соглашение о выделении специального раздела со значениями по умолчанию для других разделов или для целей интерполяции – это мощная концепция данной библиотеки, позволяющая создавать сложные декларативные конфигурации. Обычно этот раздел называется "DEFAULT", но его можно настроить на любое другое допустимое имя раздела. Некоторые типичные значения: "general" или "common". Указанное имя используется для распознавания разделов по умолчанию при чтении из любого источника, а также при записи конфигурации обратно в файл. Текущее значение можно получить с помощью атрибута parser_instance.default_section и изменить во время выполнения (например, для преобразования файлов из одного формата в другой).

  • interpolation, значение по умолчанию: configparser.BasicInterpolation

    Поведение интерполяции можно настроить, передав собственный обработчик через аргумент interpolation. Значение None можно использовать для полного отключения интерполяции, ExtendedInterpolation() предоставляет более продвинутый вариант, вдохновлённый zc.buildout. Подробнее об этом в специальном разделе документации. RawConfigParser имеет значение по умолчанию None.

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

configparser.BOOLEAN_STATES

По умолчанию при использовании getboolean() анализаторы конфигов считают следующие значения True: '1', 'yes', 'true', 'on', а следующие значения False: '0', 'no', 'false', 'off'. Можно переопределить это, указав собственный словарь строк и их булевых значений. Например:

>>> custom = configparser.ConfigParser()
>>> custom['section1'] = {'funky': 'nope'}
>>> custom['section1'].getboolean('funky')
Traceback (most recent call last):
...
ValueError: Not a boolean: nope
>>> custom.BOOLEAN_STATES = {'sure': True, 'nope': False}
>>> custom['section1'].getboolean('funky')
False

Другие типичные булевы пары включают accept/reject или enabled/disabled.

configparser.optionxform(option)

Этот метод преобразует имена параметров при каждой операции чтения, получения или установки. По умолчанию он приводит имя к нижнему регистру. Это также означает, что при записи конфигурационного файла все ключи будут в нижнем регистре. Переопределите этот метод, если такое поведение не подходит. Например:

>>> config = """
... [Section1]
... Key = Value
...
... [Section2]
... AnotherKey = Value
... """
>>> typical = configparser.ConfigParser()
>>> typical.read_string(config)
>>> list(typical['Section1'].keys())
['key']
>>> list(typical['Section2'].keys())
['anotherkey']
>>> custom = configparser.RawConfigParser()
>>> custom.optionxform = lambda option: option
>>> custom.read_string(config)
>>> list(custom['Section1'].keys())
['Key']
>>> list(custom['Section2'].keys())
['AnotherKey']
configparser.SECTCRE

Скомпилированное регулярное выражение для разбора заголовков разделов. По умолчанию соответствует [section] имени "section". Пробелы считаются частью имени раздела, поэтому [  larch  ] будет прочитан как раздел с именем "  larch  ". Переопределите этот атрибут, если это не подходит. Например:

>>> config = """
... [Section 1]
... option = value
...
... [  Section 2  ]
... another = val
... """
>>> typical = ConfigParser()
>>> typical.read_string(config)
>>> typical.sections()
['Section 1', '  Section 2  ']
>>> custom = ConfigParser()
>>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]")
>>> custom.read_string(config)
>>> custom.sections()
['Section 1', 'Section 2']

Примечание

Хотя объекты ConfigParser также используют атрибут OPTCRE для распознавания строк опций, переопределять его не рекомендуется, так как это будет мешать параметрам конструктора allow_no_value и delimiters.

13.2.8. Примеры устаревшего APILegacy API Examples

В основном из соображений обратной совместимости configparser также предоставляет устаревший API с явными методами get/set. Хотя для описанных ниже методов есть обоснованные случаи использования, для новых проектов предпочтительнее доступ через протокол отображения. Устаревший API временами более продвинутый, низкоуровневый и откровенно неинтуитивный.

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

import configparser

config = configparser.RawConfigParser()

# Обратите внимание: используя функции set класса RawConfigParser, можно присваивать
# ключам внутренние значения, не являющиеся строками, но при попытке
# записи в файл или при получении значения в не-сыром режиме возникнет ошибка. Присваивание
# значений через протокол отображения или ConfigParser.set() не допускает
# выполнения таких присваиваний.
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', 'w') 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:

import configparser

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

# Установите необязательный аргумент *raw* метода get() в True, если требуется отключить
# интерполяцию в одной операции get.
print(cfg.get('Section1', 'foo', raw=False)) # -> "Python – это весело!"
print(cfg.get('Section1', 'foo', raw=True))  # -> "%(bar)s – это %(baz)s!"

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

# Необязательный аргумент *fallback* можно использовать для предоставления запасного значения
print(cfg.get('Section1', 'foo'))
      # -> "Python – это весело!"

print(cfg.get('Section1', 'foo', fallback='Monty is not.'))
      # -> "Python – это весело!"

print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))
      # -> "Монстров не существует."

# Голый вызов print(cfg.get('Section1', 'monster')) вызовет NoOptionError, но мы также можем использовать:
# но мы также можем использовать:

print(cfg.get('Section1', 'monster', fallback=None))
      # -> None

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

import configparser

# Новый экземпляр с 'bar' и 'baz', по умолчанию равными 'Life' и 'hard' соответственно.
config = configparser.ConfigParser({'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')) # -> "Жизнь тяжела!"

13.2.9. Объекты ConfigParserConfigParser Objects

class configparser.ConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT, interpolation=BasicInterpolation())

Основной парсер конфигурации. Когда задан defaults, он инициализируется как словарь внутренних значений по умолчанию. Когда задан dict_type, он будет использоваться для создания словарей для списка разделов, опций внутри раздела и значений по умолчанию.

Если указан delimiters, он используется как набор подстрок, разделяющих ключи и значения. Если указан comment_prefixes, он будет использоваться как набор подстрок, обозначающих начало комментария в пустых строках. Комментарии могут быть с отступом. Если указан inline_comment_prefixes, он будет использоваться как набор подстрок, обозначающих начало комментария в непустых строках.

Если strict равен True (по умолчанию), синтаксический анализатор не допустит повторяющихся разделов или параметров при чтении из одного источника (файла, строки или словаря), вызывая DuplicateSectionError или DuplicateOptionError. Если empty_lines_in_values равен False (по умолчанию: True), каждая пустая строка означает конец параметра. В противном случае внутренние пустые строки многострочного параметра сохраняются как часть значения. Если allow_no_value равен True (по умолчанию: False), параметры без значений принимаются; значение для них равно None, и они сериализуются без завершающего разделителя.

Если указан default_section, он задаёт имя для специального раздела, содержащего значения по умолчанию для других разделов и целей интерполяции (обычно называется "DEFAULT"). Это значение можно получить и изменить во время выполнения с помощью атрибута экземпляра default_section.

Поведение интерполяции можно настроить, предоставив пользовательский обработчик через аргумент interpolation. None можно использовать для полного отключения интерполяции, ExtendedInterpolation() предоставляет более продвинутый вариант, вдохновлённый zc.buildout. Подробнее об этом в соответствующем разделе документации.

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

Изменено в версии 3.1: По умолчанию dict_type имеет значение collections.OrderedDict.

Изменено в версии 3.2: allow_no_value, delimiters, comment_prefixes, strict, empty_lines_in_values, default_section и interpolation были добавлены.

defaults()

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

sections()

Возвращает список доступных разделов; раздел по умолчанию не включён в список.

add_section(section)

Добавляет раздел с именем section в экземпляр. Если раздел с таким именем уже существует, вызывается DuplicateSectionError. Если передано имя раздела по умолчанию, вызывается ValueError. Имя раздела должно быть строкой; в противном случае вызывается TypeError.

Изменено в версии 3.2: Названия секций, не являющиеся строками, вызывают TypeError.

has_section(section)

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

options(section)

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

has_option(section, option)

Если указанный section существует и содержит указанный option, возвращает True; в противном случае возвращает False. Если указанный section равен None или пустой строке, предполагается DEFAULT.

read(filenames, encoding=None)

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

import configparser, os

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

Новое в версии 3.2: Параметр encoding. Ранее все файлы читались с использованием кодировки по умолчанию для open().

read_file(f, source=None)

Читает и разбирает данные конфигурации из f, который должен быть итерируемым объектом, возвращающим строки Unicode (например, файлы, открытые в текстовом режиме).

Необязательный аргумент source указывает имя читаемого файла. Если он не задан и у f есть атрибут name, то он используется для source; по умолчанию – '<???>'.

Новое в версии 3.2: Заменяет readfp().

read_string(string, source='<string>')

Разбирает данные конфигурации из строки.

Необязательный аргумент source задаёт контекстно-зависимое имя переданной строки. Если он не указан, используется '<string>'. Обычно это должен быть путь файловой системы или URL.

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

read_dict(dictionary, source='<dict>')

Загружает конфигурацию из любого объекта, который предоставляет dict-подобный метод items(). Ключи – имена разделов, значения – словари с ключами и значениями, которые должны присутствовать в разделе. Если используемый тип словаря сохраняет порядок, разделы и их ключи будут добавлены по порядку. Значения автоматически преобразуются в строки.

Необязательный аргумент source задаёт контекстно-зависимое имя переданного словаря. Если не указан, используется <dict>.

Этот метод можно использовать для копирования состояния между парсерами.

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

get(section, option, *, raw=False, vars=None[, fallback])

Получает значение option для указанного section. Если передан vars, он должен быть словарём. Поиск option осуществляется в vars (если передан), section и DEFAULTSECT в указанном порядке. Если ключ не найден и передан fallback, он используется как запасное значение. В качестве значения fallback можно передать None.

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

Изменено в версии 3.2: Аргументы raw, vars и fallback стали только ключевыми (keyword-only), чтобы защитить пользователей от попыток использовать третий аргумент как fallback (запасной) (особенно при использовании протокола отображения).

getint(section, option, *, raw=False, vars=None[, fallback])

Удобный метод, который приводит параметр в указанном разделе к целому числу. См. get() для пояснения raw, vars и fallback.

getfloat(section, option, *, raw=False, vars=None[, fallback])

Удобный метод, который приводит параметр в указанном разделе к числу с плавающей запятой. См. get() для пояснения raw, vars и fallback.

getboolean(section, option, *, raw=False, vars=None[, fallback])

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

items(raw=False, vars=None)
items(section, raw=False, vars=None)

Если section не указан, возвращает список пар section_name, section_proxy, включая DEFAULTSECT.

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

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

set(section, option, value)

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

write(fileobject, space_around_delimiters=True)

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

remove_option(section, option)

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

remove_section(section)

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

optionxform(option)

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

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

cfgparser = ConfigParser()
cfgparser.optionxform = str

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

readfp(fp, filename=None)

Устарело с версии 3.2: Вместо этого используйте read_file().

Изменено в версии 3.2: readfp() теперь выполняет итерацию по f вместо вызова f.readline().

Для существующего кода, вызывающего readfp() с аргументами, которые не поддерживают итерацию, может быть использован следующий генератор в качестве обёртки вокруг файлоподобного объекта:

def readline_generator(f):
    line = f.readline()
    while line:
        yield line
        line = f.readline()

Вместо parser.readfp(f) используйте parser.read_file(readline_generator(f)).

configparser.MAX_INTERPOLATION_DEPTH

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

13.2.10. Объекты RawConfigParserRawConfigParser Objects

class configparser.RawConfigParser(defaults=None, dict_type=collections.OrderedDict, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section=configparser.DEFAULTSECT[, interpolation])

Устаревший вариант ConfigParser с отключённой по умолчанию интерполяцией и небезопасными методами add_section и set.

Примечание

Рекомендуется использовать ConfigParser, который проверяет типы значений при внутреннем хранении. Если интерполяция не нужна, можно использовать ConfigParser(interpolation=None).

add_section(section)

Добавляет раздел с именем раздел в экземпляр. Если раздел с указанным именем уже существует, возбуждается DuplicateSectionError. Если передано имя раздел по умолчанию, возбуждается ValueError.

Тип раздела не проверяется, что позволяет пользователям создавать нестроковые именованные разделы. Такое поведение не поддерживается и может вызывать внутренние ошибки.

set(section, option, value)

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

Этот метод позволяет пользователям присваивать нестроковые значения ключам внутри. Такое поведение не поддерживается и приведет к ошибкам при попытке записи в файл или получении значения в несыром режиме. Используйте API протокола отображения, который не допускает таких присваиваний.

13.2.11. ИсключенияExceptions

exception configparser.Error

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

exception configparser.NoSectionError

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

exception configparser.DuplicateSectionError

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

Новое в версии 3.2: Добавлены необязательные атрибуты и аргументы source и lineno для __init__().

exception configparser.DuplicateOptionError

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

exception configparser.NoOptionError

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

exception configparser.InterpolationError

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

exception configparser.InterpolationDepthError

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

exception configparser.InterpolationMissingOptionError

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

exception configparser.InterpolationSyntaxError

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

exception configparser.MissingSectionHeaderError

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

exception configparser.ParsingError

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

Изменено в версии 3.2: Атрибут filename и аргумент __init__() были переименованы в source для согласованности.

Сноски

[1](1, 2, 3, 4, 5, 6, 7, 8, 9) Парсеры конфигурационных файлов допускают широкую настройку. Если вам интересно изменить поведение, описанное в сноске, обратитесь к разделу Настройка поведения парсера.