Содержание страницы
14.2. configparser – Парсер конфигурационных файлов¶configparser – Configuration file parser
Исходный код: Lib/configparser.py
Этот модуль предоставляет класс ConfigParser, реализующий базовый язык конфигурации, структура которого аналогична файлам INI в Microsoft Windows. Его можно использовать для написания программ на Python, которые конечные пользователи могут легко настраивать.
Примечание
Эта библиотека не интерпретирует и не записывает префиксы типов значений, используемые в расширенной версии синтаксиса INI из реестра Windows.
См. также
14.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.
14.2.2. Поддерживаемые типы данных¶Supported Datatypes
Парсеры конфигураций не угадывают типы данных значений в конфигурационных файлах, а всегда хранят их внутри как строки. Это означает, что если вам нужны другие типы данных, преобразование нужно выполнять самостоятельно:
>>> int(topsecret['Port'])
50022
>>> float(topsecret['CompressionLevel'])
9.0
Поскольку эта задача встречается часто, парсеры конфигураций предоставляют ряд удобных методов-геттеров для работы с целыми числами, числами с плавающей точкой и булевыми значениями. Последний тип наиболее интересен, потому что простая передача значения в bool() не даст результата, поскольку bool('False') все еще является True. Именно поэтому парсеры конфигураций также предоставляют метод getboolean(). Этот метод нечувствителен к регистру и распознает булевы значения из 'yes'/'no', 'on'/'off', 'true'/'false' и '1'/'0' 1. Например:
>>> topsecret.getboolean('ForwardX11')
False
>>> config['bitbucket.org'].getboolean('ForwardX11')
True
>>> config.getboolean('bitbucket.org', 'Compression')
True
Помимо getboolean(), парсеры конфигураций также предоставляют эквивалентные методы getint() и getfloat(). Вы можете зарегистрировать собственные преобразователи и настроить предоставленные. 1
14.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
14.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]
# как этот
; или этот
# По умолчанию только в пустой строке.
# Встроенные комментарии могут быть вредны, поскольку не позволяют пользователям
# использовать разделительные символы как части значений.
# Тем не менее, это можно настроить.
[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
# Кстати, комментарии тоже можно делать с отступом.
14.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}
14.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()совместим с протоколом отображения (возвращает список пар название_раздела, прокси_раздела, включая DEFAULTSECT). Однако этот метод также может быть вызван с аргументами:parser.items(section, raw, vars). Последний вызов возвращает список пар опция, значение для указанногоsection, со всеми раскрытыми интерполяциями (если не указанraw=True).
Протокол отображения реализован поверх существующего устаревшего API, поэтому подклассы, переопределяющие исходный интерфейс, по-прежнему должны работать с отображением, как и ожидается.
14.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.converters, значение по умолчанию: не задано
Парсеры конфигурации предоставляют геттеры значений параметров, выполняющие преобразование типов. По умолчанию реализованы
getint(),getfloat()иgetboolean(). Если нужны другие геттеры, пользователи могут определить их в подклассе или передать словарь, где каждый ключ – имя преобразователя, а каждое значение – вызываемый объект, реализующий это преобразование. Например, передача{'decimal': decimal.Decimal}добавитgetdecimal()как на объект парсера, так и на все прокси разделов. Другими словами, станет возможным писать какparser_instance.getdecimal('section', 'key', fallback=0), так иparser_instance['section'].getdecimal('key', 0).Если преобразователю требуется доступ к состоянию парсера, его можно реализовать как метод подкласса парсера конфигурации. Если имя этого метода начинается с
get, он будет доступен на всех прокси разделов в dict-совместимой форме (см. примерgetdecimal()выше).
Более тонкую настройку можно выполнить, переопределив значения по умолчанию этих атрибутов парсера. Значения по умолчанию заданы на уровне классов, поэтому их можно переопределить в подклассах или путём присваивания атрибуту.
-
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.
14.2.8. Примеры устаревшего API¶Legacy 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')) # -> "Жизнь тяжела!"
14.2.9. Объекты ConfigParser¶ConfigParser 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(), converters={})¶ Основной парсер конфигурации. Когда задан 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эквивалентны.Когда задан converters, это должен быть словарь, где каждый ключ представляет имя конвертера типов, а каждое значение – вызываемый объект, реализующий преобразование из строки в нужный тип данных. Каждый конвертер получает свой собственный соответствующий метод
get*()на объекте парсера и прокси-объектах разделов.Изменено в версии 3.1: Значение по умолчанию dict_type –
collections.OrderedDict.Изменено в версии 3.2: Были добавлены allow_no_value, delimiters, comment_prefixes, strict, empty_lines_in_values, default_section и interpolation.
Изменено в версии 3.5: Был добавлен аргумент converters.
-
defaults()¶ Возвращает словарь, содержащий значения по умолчанию для экземпляра.
-
sections()¶ Возвращает список доступных разделов; раздел по умолчанию не включён в список.
-
add_section(section)¶ Добавляет раздел с именем section в экземпляр. Если раздел с таким именем уже существует, возбуждается
DuplicateSectionError. Если передано имя раздела по умолчанию, возбуждаетсяValueError. Имя раздела должно быть строкой; в противном случае возбуждаетсяTypeError.Изменено в версии 3.2: Имена разделов, не являющиеся строками, вызывают
TypeError.
-
has_section(section)¶ Указывает, присутствует ли в конфигурации указанный раздел. Раздел по умолчанию не учитывается.
-
options(section)¶ Возвращает список доступных параметров в указанном разделе.
-
has_option(section, option)¶ Если указанный раздел существует и содержит указанный параметр, вернуть
True; в противном случае вернутьFalse. Если указанный раздел равен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().Новое в версии 3.6.1: Параметр filenames принимает объект, подобный пути.
-
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>')¶ Загружает конфигурацию из любого объекта, предоставляющего метод
items(), подобный словарю. Ключи – это имена разделов, значения – словари с ключами и значениями, которые должны присутствовать в разделе. Если используемый тип словаря сохраняет порядок, разделы и их ключи будут добавлены по порядку. Значения автоматически преобразуются в строки.Необязательный аргумент source задаёт контекстно-зависимое имя переданного словаря. Если не указан, используется
<dict>.Этот метод можно использовать для копирования состояния между парсерами.
Новое в версии 3.2.
-
get(section, option, *, raw=False, vars=None[, fallback])¶ Получает значение параметра для указанного раздела. Если указан vars, он должен быть словарём. Параметр ищется в vars (если указан), разделе и в DEFAULTSECT в указанном порядке. Если ключ не найден и указан fallback, он используется как запасное значение.
Noneможет быть указан в качестве запасного значения.Все операции
'%'интерполяции раскрываются в возвращаемых значениях, если только аргумент raw не равен true. Значения для ключей интерполяции ищутся так же, как и параметр.Изменено в версии 3.2: Аргументы raw, vars и fallback стали только ключевыми, чтобы защитить пользователей от попытки использовать третий аргумент в качестве запасного значения fallback (особенно при использовании протокола отображения).
-
getint(section, option, *, raw=False, vars=None[, fallback])¶ Удобный метод, который преобразует параметр в указанном разделе в целое число. См.
get()для объяснения raw, vars и fallback.
-
getfloat(section, option, *, raw=False, vars=None[, fallback])¶ Удобный метод, который приводит option в указанном разделе section к числу с плавающей запятой. См.
get()для пояснения параметров raw, vars и fallback.
-
getboolean(section, option, *, raw=False, vars=None[, fallback])¶ Удобный метод, который приводит option в указанном section к логическому значению. Обратите внимание, что допустимыми значениями для параметра являются
'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.
В противном случае возвращает список пар name, value для параметров в указанном section. Необязательные аргументы имеют тот же смысл, что и для метода
get().
-
set(section, option, value)¶ Если указанный раздел существует, устанавливает заданный параметр в указанное значение; в противном случае возбуждает исключение
NoSectionError. option и value должны быть строками; в противном случае возбуждается исключениеTypeError.
-
write(fileobject, space_around_delimiters=True)¶ Записывает представление конфигурации в указанный файловый объект, который должен быть открыт в текстовом режиме (принимает строки). Это представление может быть разобрано будущим вызовом
read(). Если space_around_delimiters равно true, разделители между ключами и значениями окружаются пробелами.
-
remove_option(section, option)¶ Удаляет указанный option из указанного section. Если раздел не существует, возбуждает исключение
NoSectionError. Если параметр существовал и был удалён, возвращаетTrue; в противном случае возвращаетFalse.
-
remove_section(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()теперь выполняет итерацию по fp вместо вызоваfp.readline().Для существующего кода, вызывающего
readfp()с аргументами, которые не поддерживают итерацию, следующий генератор можно использовать как обёртку вокруг файлоподобного объекта:def readline_generator(fp): line = fp.readline() while line: yield line line = fp.readline()
Вместо
parser.readfp(fp)используйтеparser.read_file(readline_generator(fp)).
-
-
configparser.MAX_INTERPOLATION_DEPTH¶ Максимальная глубина рекурсивной интерполяции для
get(), когда параметр raw равен false. Это актуально только при использовании интерполяция по умолчанию.
14.2.10. Объекты RawConfigParser¶RawConfigParser 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)¶ Добавляет раздел с именем section в экземпляр. Если раздел с указанным именем уже существует, возникает
DuplicateSectionError. Если передано имя раздела по умолчанию, возникаетValueError.Тип section не проверяется, что позволяет создавать разделы с нестроковыми именами. Это поведение не поддерживается и может вызывать внутренние ошибки.
-
set(section, option, value)¶ Если указанный раздел существует, устанавливает указанный параметр в заданное значение; иначе возбуждает
NoSectionError. Хотя для внутреннего хранения нестроковых значений можно использоватьRawConfigParser(илиConfigParserс параметром raw, установленным в true), полная функциональность (включая интерполяцию и вывод в файлы) достигается только при использовании строковых значений.Этот метод позволяет пользователям присваивать нестроковые значения ключам внутри. Такое поведение не поддерживается и приведет к ошибкам при попытке записи в файл или получении значения в несыром режиме. Используйте API протокола отображения, который не допускает таких присваиваний.
-
14.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для согласованности.
Сноски