configparser — анализатор файлов конфигурации
Исходный код: Lib/configparser.py
Этот модуль предоставляет класс ConfigParser, реализующий базовый язык конфигурации со структурой, похожей на ту, что используется в INI-файлах Microsoft Windows. С его помощью можно создавать программы на Python, которые конечные пользователи смогут легко настраивать.
Примечание
Эта библиотека не интерпретирует и не записывает префиксы типов значений, используемые в расширенной версии синтаксиса INI для реестра Windows.
См. также
-
Moduletomllib -
TOML — это хорошо специфицированный формат файлов конфигурации приложений. Он специально разработан как улучшенная версия INI.
-
Moduleshlex -
Поддержка создания мини-языков, похожих на оболочку Unix, которые также можно использовать для файлов конфигурации приложений.
-
Modulejson -
Модуль
jsonреализует подмножество синтаксиса JavaScript, которое иногда используется для конфигурации, но не поддерживает комментарии.
Краткое руководство
Рассмотрим очень простой файл конфигурации следующего вида:
[DEFAULT] ServerAliveInterval = 45 Compression = yes CompressionLevel = 9 ForwardX11 = yes [forge.example] User = hg [topsecret.server.example] Port = 50022 ForwardX11 = no
Структура INI-файлов описана в следующем разделе. По сути, файл состоит из разделов, каждый из которых содержит ключи со значениями. Классы configparser могут читать и записывать такие файлы. Для начала создадим указанный выше файл конфигурации программно.
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config['DEFAULT'] = {'ServerAliveInterval': '45',
... 'Compression': 'yes',
... 'CompressionLevel': '9'}
>>> config['forge.example'] = {}
>>> config['forge.example']['User'] = 'hg'
>>> config['topsecret.server.example'] = {}
>>> topsecret = config['topsecret.server.example']
>>> topsecret['Port'] = '50022' # mutates the parser
>>> topsecret['ForwardX11'] = 'no' # same here
>>> config['DEFAULT']['ForwardX11'] = 'yes'
>>> with open('example.ini', 'w') as configfile:
... config.write(configfile)
...
Как видите, мы можем обращаться с анализатором конфигурации почти как со словарём. Есть некоторые отличия, описанные далее, но поведение очень близко к тому, что можно ожидать от словаря.
Теперь, когда мы создали и сохранили файл конфигурации, прочитаем его и изучим содержащиеся в нём данные.
>>> config = configparser.ConfigParser()
>>> config.sections()
[]
>>> config.read('example.ini')
['example.ini']
>>> config.sections()
['forge.example', 'topsecret.server.example']
>>> 'forge.example' in config
True
>>> 'python.org' in config
False
>>> config['forge.example']['User']
'hg'
>>> config['DEFAULT']['Compression']
'yes'
>>> topsecret = config['topsecret.server.example']
>>> topsecret['ForwardX11']
'no'
>>> topsecret['Port']
'50022'
>>> for key in config['forge.example']:
... print(key)
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>> config['forge.example']['ForwardX11']
'yes'
Как видно из примера выше, API довольно прост. Единственный нюанс связан с разделом DEFAULT, который предоставляет значения по умолчанию для всех остальных разделов [1]. Также обратите внимание, что ключи в разделах нечувствительны к регистру и хранятся в нижнем регистре [1].
Можно прочитать несколько конфигураций в один объект ConfigParser; наибольший приоритет будет у конфигурации, добавленной последней. При конфликте ключей используются значения из более поздней конфигурации, а существовавшие ранее ключи сохраняются. В приведённом ниже примере читается файл override.ini, который заменит любые конфликтующие ключи из файла example.ini.
[DEFAULT] ServerAliveInterval = -1
>>> config_override = configparser.ConfigParser()
>>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'}
>>> with open('override.ini', 'w') as configfile:
... config_override.write(configfile)
...
>>> config_override = configparser.ConfigParser()
>>> config_override.read(['example.ini', 'override.ini'])
['example.ini', 'override.ini']
>>> print(config_override.get('DEFAULT', 'ServerAliveInterval'))
-1
Такое поведение эквивалентно вызову ConfigParser.read() с несколькими файлами, переданными параметру filenames.
Поддерживаемые типы данных
Анализаторы конфигурации не определяют типы данных значений в файлах конфигурации, а всегда хранят их внутри как строки. Это означает, что при необходимости других типов данных преобразование нужно выполнять самостоятельно:
>>> 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['forge.example'].getboolean('ForwardX11')
True
>>> config.getboolean('forge.example', 'Compression')
True
Помимо getboolean(), анализаторы конфигурации предоставляют аналогичные методы getint() и getfloat(). Можно зарегистрировать собственные преобразователи и настроить предоставленные. [1]
Резервные значения
Как и в случае со словарём, для указания резервных значений можно использовать метод get() раздела:
>>> topsecret.get('Port')
'50022'
>>> topsecret.get('CompressionLevel')
'9'
>>> topsecret.get('Cipher')
>>> topsecret.get('Cipher', '3des-cbc')
'3des-cbc'
Обратите внимание, что значения по умолчанию имеют приоритет над резервными значениями. Например, в нашем примере ключ 'CompressionLevel' был указан только в разделе 'DEFAULT'. Если попытаться получить его из раздела 'topsecret.server.example', всегда будет возвращено значение по умолчанию, даже если указать резервное значение:
>>> topsecret.get('CompressionLevel', '3')
'9'
Также следует учитывать, что метод get() на уровне анализатора предоставляет особый, более сложный интерфейс, сохранённый для обратной совместимости. При использовании этого метода резервное значение можно передать через именованный аргумент fallback:
>>> config.get('forge.example', '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
Поддерживаемая структура INI-файлов
Файл конфигурации состоит из разделов, каждый из которых начинается с заголовка [section], за которым следуют записи «ключ/значение», разделённые определённой строкой (по умолчанию = или : [1]). По умолчанию имена разделов чувствительны к регистру, а ключи — нет [1]. Начальные и конечные пробелы в ключах и значениях удаляются. Значения можно опускать, если анализатор настроен на их разрешение [1]; в этом случае можно также опустить разделитель ключа и значения. Значения могут занимать несколько строк, если они имеют больший отступ, чем первая строка значения. В зависимости от режима анализатора пустые строки могут считаться частью многострочных значений или игнорироваться.
По умолчанию допустимым именем раздела может быть любая строка, не содержащая «\n». Чтобы изменить это правило, см. ConfigParser.SECTCRE.
Файлы конфигурации могут содержать комментарии, начинающиеся с определённых символов (по умолчанию # и ; [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?
Интерполяция значений
Помимо основных возможностей, ConfigParser поддерживает интерполяцию. Это означает, что значения могут обрабатываться перед возвратом из вызовов get().
-
class configparser.BasicInterpolation -
Реализация по умолчанию, используемая в
ConfigParser. Она позволяет включать в значения форматные строки, ссылающиеся на другие значения в том же разделе или на значения в специальном разделе значений по умолчанию [1]. Дополнительные значения по умолчанию можно указать при инициализации.Например:
[Paths] home_dir: /Users my_dir: %(home_dir)s/lumberjack my_pictures: %(my_dir)s/Pictures [Escape] # use a %% to escape the % sign (% is the only character that needs to be escaped): gain: 80%%
В приведённом выше примере
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 [Escape] # use a $$ to escape the $ sign ($ is the only character that needs to be escaped): cost: $$80Можно также получать значения из других разделов:
[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}
Доступ через протокол отображения
Добавлено в версии 3.2.
Доступ через протокол отображения — это общее название функциональности, позволяющей использовать пользовательские объекты так, как если бы они были словарями. В случае configparser реализация интерфейса отображения использует нотацию parser['section']['option'].
В частности, parser['section'] возвращает прокси для данных раздела в анализаторе. Это означает, что значения не копируются, а извлекаются из исходного анализатора по запросу. Ещё важнее то, что при изменении значений через прокси раздела они фактически изменяются в исходном анализаторе.
Объекты configparser ведут себя максимально похоже на обычные словари. Интерфейс отображения реализован полностью и соответствует ABC 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()совместим с протоколом отображения (возвращает список пар section_name, section_proxy, включая DEFAULTSECT). Однако этот метод также можно вызвать с аргументами:parser.items(section, raw, vars). Последний вызов возвращает список пар option, value для указанногоsection, раскрывая все интерполяции (если не переданraw=True).
Протокол отображения реализован поверх существующего устаревшего API, поэтому отображения должны работать ожидаемым образом и в подклассах, переопределяющих исходный интерфейс.
Настройка поведения анализатора
Вариантов формата INI почти столько же, сколько приложений, использующих его. configparser предоставляет широкую поддержку наиболее распространённых и разумных вариантов INI. Поведение по умолчанию во многом обусловлено историческими причинами, и, скорее всего, вам захочется настроить некоторые возможности.
Чаще всего поведение конкретного анализатора конфигурации изменяют с помощью параметров __init__():
-
defaults, значение по умолчанию:
NoneЭтот параметр принимает словарь пар «ключ-значение», которые изначально помещаются в раздел
DEFAULT. Это позволяет элегантно поддерживать лаконичные файлы конфигурации, в которых не указаны значения, совпадающие с документированными значениями по умолчанию.Подсказка: если нужно задать значения по умолчанию для конкретного раздела, используйте
read_dict()до чтения самого файла. -
dict_type, значение по умолчанию:
dictЭтот параметр существенно влияет на работу протокола отображения и на внешний вид записываемых файлов конфигурации. При использовании стандартного словаря каждый раздел сохраняется в порядке добавления в анализатор. То же относится к параметрам внутри разделов.
Например, для сортировки разделов и параметров при повторной записи можно использовать другой тип словаря.
Обратите внимание: добавить набор пар «ключ-значение» можно и за одну операцию. Если для таких операций использовать обычный словарь, порядок ключей будет сохранён. Например:
>>> 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() ['section1', 'section2', 'section3'] >>> [option for option in parser['section3']] ['foo', 'bar', 'baz'] -
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) >>> # Settings with values are treated as before: >>> config["mysqld"]["user"] 'mysql' >>> # Settings without values provide None: >>> config["mysqld"]["skip-bdb"] >>> # Settings which aren't specified still raise an error: >>> 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()) >>> # the default BasicInterpolation could be used as well >>> 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, он станет доступен во всех прокси разделов в форме, совместимой со словарём (см. пример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']
Примечание
Функция optionxform преобразует имена параметров в каноническую форму. Она должна быть идемпотентной: если имя уже находится в канонической форме, оно должно возвращаться без изменений.
-
ConfigParser.SECTCRE -
Скомпилированное регулярное выражение, используемое для разбора заголовков разделов. По умолчанию оно сопоставляет
[section]с именем"section". Пробелы считаются частью имени раздела, поэтому[ larch ]будет прочитано как раздел с именем" larch ". Если такое поведение не подходит, переопределите этот атрибут. Например:>>> import re >>> config = """ ... [Section 1] ... option = value ... ... [ Section 2 ] ... another = val ... """ >>> typical = configparser.ConfigParser() >>> typical.read_string(config) >>> typical.sections() ['Section 1', ' Section 2 '] >>> custom = configparser.ConfigParser() >>> custom.SECTCRE = re.compile(r"\[ *(?P<header>[^]]+?) *\]") >>> custom.read_string(config) >>> custom.sections() ['Section 1', 'Section 2']
Примечание
Хотя объекты ConfigParser также используют атрибут
OPTCREдля распознавания строк параметров, переопределять его не рекомендуется, поскольку это помешает работе параметров конструктора allow_no_value и delimiters.
Примеры устаревшего API
В основном из соображений обратной совместимости configparser также предоставляет устаревший API с явными методами get/set. Хотя описанные ниже методы могут быть полезны в некоторых случаях, в новых проектах предпочтителен доступ через протокол отображения. Устаревший API иногда сложнее, работает на более низком уровне и порой совершенно нелогичен.
Пример записи в файл конфигурации:
import configparser
config = configparser.RawConfigParser()
# Please note that using RawConfigParser's set functions, you can assign
# non-string values to keys internally, but will receive an error when
# attempting to write to a file or when you get it in non-raw mode. Setting
# values using the mapping protocol or ConfigParser's set() does not allow
# such assignments to take place.
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!')
# Writing our configuration file to 'example.cfg'
with open('example.cfg', 'w') as configfile:
config.write(configfile)
Пример повторного чтения файла конфигурации:
import configparser
config = configparser.RawConfigParser()
config.read('example.cfg')
# getfloat() raises an exception if the value is not a float
# getint() and getboolean() also do this for their respective types
a_float = config.getfloat('Section1', 'a_float')
an_int = config.getint('Section1', 'an_int')
print(a_float + an_int)
# Notice that the next output does not interpolate '%(bar)s' or '%(baz)s'.
# This is because we are using a RawConfigParser().
if config.getboolean('Section1', 'a_bool'):
print(config.get('Section1', 'foo'))
Для включения интерполяции используйте ConfigParser:
import configparser
cfg = configparser.ConfigParser()
cfg.read('example.cfg')
# Set the optional *raw* argument of get() to True if you wish to disable
# interpolation in a single get operation.
print(cfg.get('Section1', 'foo', raw=False)) # -> "Python is fun!"
print(cfg.get('Section1', 'foo', raw=True)) # -> "%(bar)s is %(baz)s!"
# The optional *vars* argument is a dict with members that will take
# precedence in interpolation.
print(cfg.get('Section1', 'foo', vars={'bar': 'Documentation',
'baz': 'evil'}))
# The optional *fallback* argument can be used to provide a fallback value
print(cfg.get('Section1', 'foo'))
# -> "Python is fun!"
print(cfg.get('Section1', 'foo', fallback='Monty is not.'))
# -> "Python is fun!"
print(cfg.get('Section1', 'monster', fallback='No such things as monsters.'))
# -> "No such things as monsters."
# A bare print(cfg.get('Section1', 'monster')) would raise NoOptionError
# but we can also use:
print(cfg.get('Section1', 'monster', fallback=None))
# -> None
Значения по умолчанию доступны в обоих типах ConfigParser. Они используются при интерполяции, если используемый параметр не определён в другом месте.
import configparser
# New instance with 'bar' and 'baz' defaulting to 'Life' and 'hard' each
config = configparser.ConfigParser({'bar': 'Life', 'baz': 'hard'})
config.read('example.cfg')
print(config.get('Section1', 'foo')) # -> "Python is fun!"
config.remove_option('Section1', 'bar')
config.remove_option('Section1', 'baz')
print(config.get('Section1', 'foo')) # -> "Life is hard!"
Объекты ConfigParser
-
class configparser.ConfigParser(defaults=None, dict_type=dict, 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*()у объекта анализатора и прокси разделов.В один экземпляр
ConfigParserможно прочитать несколько конфигураций; наивысший приоритет имеет конфигурация, добавленная последней. Все конфликтующие ключи берутся из более новой конфигурации, а ранее существовавшие ключи сохраняются. В приведённом ниже примере считывается файлoverride.ini, который заменит все конфликтующие ключи из файлаexample.ini.[DEFAULT] ServerAliveInterval = -1
>>> config_override = configparser.ConfigParser() >>> config_override['DEFAULT'] = {'ServerAliveInterval': '-1'} >>> with open('override.ini', 'w') as configfile: ... config_override.write(configfile) ... >>> config_override = configparser.ConfigParser() >>> config_override.read(['example.ini', 'override.ini']) ['example.ini', 'override.ini'] >>> print(config_override.get('DEFAULT', 'ServerAliveInterval')) -1Изменено в версии 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.
Изменено в версии 3.7: Аргумент defaults считывается с помощью
read_dict(), что обеспечивает единообразное поведение анализатора: ключи и значения, не являющиеся строками, неявно преобразуются в строки.Изменено в версии 3.8: Тип словаря dict_type по умолчанию —
dict, поскольку теперь он сохраняет порядок вставки.-
defaults() -
Возвращает словарь, содержащий значения по умолчанию для всего экземпляра.
-
sections() -
Возвращает список доступных разделов; раздел по умолчанию в список не включается.
-
add_section(section) -
Добавляет в экземпляр раздел с именем section. Если раздел с таким именем уже существует, вызывается исключение
DuplicateSectionError. Если передано имя раздела по умолчанию, вызывается исключениеValueError. Имя раздела должно быть строкой; в противном случае вызывается исключениеTypeError.Изменено в версии 3.2: Для имён разделов, не являющихся строками, вызывается исключение
TypeError.
-
has_section(section) -
Показывает, присутствует ли в конфигурации раздел с указанным именем section. Раздел по умолчанию не учитывается.
-
options(section) -
Возвращает список параметров, доступных в указанном разделе section.
-
has_option(section, option) -
Если указанный раздел section существует и содержит указанный параметр option, возвращает
True; в противном случае возвращаетFalse. Если указанный раздел section равенNoneили является пустой строкой, подразумевается DEFAULT.
-
read(filenames, encoding=None) -
Пытается прочитать и разобрать итерируемый объект с именами файлов и возвращает список успешно разобранных файлов.
Если filenames — это строка, объект
bytesили объект, подобный пути, он рассматривается как имя одного файла. Если файл, указанный в 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 принимает объект, подобный пути.
Изменено в версии 3.7: Параметр filenames принимает объект
bytes.
-
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]) -
Возвращает значение параметра option для раздела с указанным именем section. Если указан аргумент vars, он должен быть словарём. Параметр option ищется последовательно в vars (если он задан), в section и в DEFAULTSECT. Если ключ не найден и указан аргумент fallback, он используется как запасное значение. В качестве значения fallback можно указать
None.В возвращаемых значениях разворачиваются все подстановки
'%', если только аргумент raw не равен true. Значения ключей для подстановки ищутся таким же образом, как и значение параметра.Изменено в версии 3.2: Аргументы raw, vars и fallback можно передавать только по имени, чтобы не допустить попыток использовать третий аргумент в качестве запасного значения fallback (особенно при использовании протокола отображения).
-
getint(section, option, *, raw=False, vars=None[, fallback]) -
Вспомогательный метод, преобразующий параметр option в указанном разделе section в целое число. Пояснения аргументов raw, vars и fallback см. в описании
get().
-
getfloat(section, option, *, raw=False, vars=None[, fallback]) -
Вспомогательный метод, преобразующий параметр option в указанном разделе section в число с плавающей точкой. Пояснения аргументов raw, vars и fallback см. в описании
get().
-
getboolean(section, option, *, raw=False, vars=None[, fallback]) -
Вспомогательный метод, преобразующий параметр option в указанном разделе section в логическое значение. Обратите внимание, что допустимые значения параметра:
'1','yes','true'и'on'— при их указании метод возвращаетTrue; а'0','no','false'и'off'— при их указании метод возвращаетFalse. Эти строковые значения проверяются без учёта регистра. Любое другое значение вызовет исключениеValueError. Пояснения аргументов raw, vars и fallback см. в описанииget().
-
items(raw=False, vars=None) - items(section, raw=False, vars=None)
-
Если section не указан, возвращает список пар section_name, section_proxy, включая DEFAULTSECT.
В противном случае возвращает список пар name, value для параметров указанного раздела section. Необязательные аргументы имеют то же значение, что и в методе
get().Изменено в версии 3.8: Элементы из vars больше не включаются в результат. Ранее фактические параметры анализатора смешивались с переменными, переданными для подстановки.
-
set(section, option, value) -
Если указанный раздел существует, задаёт указанному параметру заданное значение; в противном случае вызывает исключение
NoSectionError. option и value должны быть строками; в противном случае вызывается исключениеTypeError.
-
write(fileobject, space_around_delimiters=True) -
Записывает представление конфигурации в указанный файловый объект, который должен быть открыт в текстовом режиме (принимать строки). Это представление можно будет разобрать при последующем вызове
read(). Если space_around_delimiters имеет значение true, вокруг разделителей между ключами и значениями добавляются пробелы.
Примечание
Комментарии из исходного файла конфигурации не сохраняются при записи конфигурации. То, что считается комментарием, зависит от заданных значений comment_prefix и inline_comment_prefix.
-
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().
-
-
configparser.MAX_INTERPOLATION_DEPTH -
Максимальная глубина рекурсивной подстановки для
get(), если параметр raw имеет значение false. Это имеет значение только при использовании подстановки по умолчанию.
Объекты RawConfigParser
-
class configparser.RawConfigParser(defaults=None, dict_type=dict, 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он допускает имена разделов, имена параметров и значения, не являющиеся строками, а также обработку устаревшего именованного аргументаdefaults=.Изменено в версии 3.8: Тип словаря dict_type по умолчанию —
dict, поскольку теперь он сохраняет порядок вставки.Примечание
Рекомендуется вместо него использовать
ConfigParser, который проверяет типы сохраняемых внутри значений. Если подстановка не нужна, можно использоватьConfigParser(interpolation=None).-
add_section(section) -
Добавляет в экземпляр раздел с именем section. Если раздел с таким именем уже существует, вызывается исключение
DuplicateSectionError. Если передано имя раздела по умолчанию, вызывается исключениеValueError.Тип section не проверяется, что позволяет пользователям создавать разделы с именами, не являющимися строками. Такое поведение не поддерживается и может привести к внутренним ошибкам.
-
set(section, option, value) -
Если указанный раздел существует, задаёт указанному параметру заданное значение; в противном случае вызывает исключение
NoSectionError. ХотяRawConfigParser(илиConfigParserс параметром raw, установленным в true) позволяет внутренне хранить значения, не являющиеся строками, полную функциональность (включая подстановку и запись в файлы) можно обеспечить только при использовании строковых значений.Этот метод позволяет пользователям внутренне присваивать ключам значения, не являющиеся строками. Такое поведение не поддерживается и приведёт к ошибкам при попытке записать данные в файл или получить их в режиме, отличном от raw. Используйте API протокола отображения, который не допускает таких присваиваний.
-
Исключения
-
exception configparser.Error -
Базовый класс для всех остальных исключений
configparser.
-
exception configparser.NoSectionError -
Исключение, возникающее, если указанный раздел не найден.
-
exception configparser.DuplicateSectionError -
Исключение, возникающее, если
add_section()вызывается с именем уже существующего раздела или если строгий анализатор обнаруживает раздел более одного раза в одном входном файле, строке или словаре.Изменено в версии 3.2: В
__init__()добавлены необязательные атрибуты и параметры source и lineno.
-
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.12: Атрибут
filenameи аргумент конструктора__init__()удалены. С версии 3.2 они доступны под именемsource.
Сноски
© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.12/library/configparser.html