configparser — Парсер конфигурационных файлов
Исходный код: Lib/configparser.py
Этот модуль предоставляет класс ConfigParser, который реализует базовый язык конфигурации, предоставляющий структуру, аналогичную структурам файлов INI в Microsoft Windows. Вы можете использовать его для написания программ Python, которые легко настраиваются конечными пользователями.
Примечание
Эта библиотека не интерпретирует и не записывает префиксы типов значений, используемые в расширенной версии синтаксиса INI в реестре Windows.
См. также
Быстрый старт
Рассмотрим очень простой файл конфигурации, который выглядит так:
[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' # 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()
['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.
Поддерживаемые типы данных
Парсеры конфигурации не угадывают типы данных значений в файлах конфигурации, всегда храня их во внутреннем представлении как строки. Это означает, что если вам нужны другие типы данных, вы должны выполнить преобразование самостоятельно:
>>> 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
Значения по умолчанию
Как и в словаре, вы можете использовать метод 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
Поддерживаемая структура INI-файла
Файл конфигурации состоит из разделов, каждый из которых начинается с заголовка [section], за которым следуют записи ключ/значение, разделённые определённой строкой (= или : по умолчанию 1). По умолчанию имена разделов чувствительны к регистру, но ключи — нет 1. Пробелы в начале и конце ключей и значений удаляются. Значения могут быть опущены, если парсер настроен на разрешение этого 1, в таком случае разделитель ключ/значение также может быть опущен. Значения также могут занимать несколько строк, при условии, что они отступают сильнее, чем первая строка значения. В зависимости от режима парсера пустые строки могут рассматриваться как части многострочных значений или игнорироваться.
По умолчанию допустимым именем раздела может быть любая строка, не содержащая ‘\n’ или ‘]’. Чтобы изменить это, см. ConfigParser.SECTCRE.
Файлы конфигурации могут содержать комментарии, начинающиеся с определённых символов (# и ; по умолчанию 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с интерполяцией, установленной на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()совместим с протоколом сопоставления (возвращает список пар имя_раздела, прокси_раздела, включая DEFAULTSECT). Однако этот метод также может быть вызван с аргументами:parser.items(section, raw, vars). Последний вызов возвращает список пар опция, значение для указанного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
Значения по умолчанию доступны в обоих типах ConfigParsers. Они используются в интерполяции, если используемый параметр не определен в другом месте.
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_valuesFalse(значение по умолчанию:True), каждая пустая строка отмечает конец опции. В противном случае внутренние пустые строки многострочной опции сохраняются как часть значения. Когда allow_no_valueTrue(по умолчанию: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.
Изменено в версии 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) -
Указывает, присутствует ли заданный раздел в конфигурации. Раздел по умолчанию не учитывается.
-
options(section) -
Возвращает список опций, доступных в заданном разделе.
-
has_option(section, option) -
Если заданный раздел существует и содержит заданную опцию, возвращает
True; в противном случае —False. Если указанный раздел равен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, который должен быть итерируемым, возвращающим строки Юникода (например, файлы, открытые в текстовом режиме).
Необязательный аргумент source указывает имя считываемого файла. Если не указан и у f есть атрибут
name, он используется для source; значение по умолчанию —'<???>'.Добавлена в версии 3.2: Заменяет
readfp().
-
read_string(string, source='<string>') -
Парсит данные конфигурации из строки.
Необязательный аргумент source указывает контекстно-специфическое имя переданной строки. Если не задан, используется
'<string>'. Это обычно должно быть файловый путь или URL.Добавлена в версии 3.2.
-
read_dict(dictionary, source='<dict>') -
Загружает конфигурацию из любого объекта, предоставляющего метод
dict-likeitems(). Ключи — имена разделов, значения — словари с ключами и значениями, которые должны присутствовать в разделе. Если используемый тип словаря сохраняет порядок, разделы и их ключи будут добавлены в порядке. Значения автоматически преобразуются в строки.Необязательный аргумент source указывает контекстно-специфическое имя переданного словаря. Если не задан, используется
<dict>.Этот метод может использоваться для копирования состояния между парсерами.
Добавлена в версии 3.2.
-
-
get(section, option, *, raw=False, vars=None[, fallback]) -
Получить значение параметра для указанной раздела. Если предоставлен переменные, он должен быть словарем. Параметр ищется в переменные (если предоставлен), раздела и в DEFAULTSECT в указанном порядке. Если ключ не найден и указано fallback, используется значение по умолчанию.
Noneможет быть предоставлен как fallback значение.Все
'%'интерполяции расширяются в возвращаемых значениях, если аргумент raw не является true. Значения для ключей интерполяции ищутся так же, как и параметр.Изменено в версии 3.2: Аргументы raw, vars и fallback являются только ключевыми, чтобы защитить пользователей от попыток использовать третий аргумент как fallback 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) -
Если раздел не указан, возвращает список пар имя_раздела, прокси_раздела, включая DEFAULTSECT.
В противном случае возвращает список пар имя, значение для параметров в заданном разделе. Дополнительные аргументы имеют то же значение, что и для метода
get().Изменено в версии 3.8: Элементы, присутствующие в переменные, больше не отображаются в результате. Предыдущее поведение смешивало фактические параметры парсера с переменными, предоставленными для интерполяции.
-
set(section, option, value) -
Если указанный раздел существует, установить заданный параметр на указанное значение; в противном случае вызывается
NoSectionError. параметр и значение должны быть строками; в противном случае возникаетTypeError.
-
write(fileobject, space_around_delimiters=True) -
Записать представление конфигурации в указанный объект файла, который должен быть открыт в текстовом режиме (принимая строки). Это представление может быть обработано будущим вызовом
read(). Если space_around_delimiters равно true, разделители между ключами и значениями окружены пробелами.
Примечание
Комментарии в исходном файле конфигурации не сохраняются при записи конфигурации обратно. Что считается комментарием, зависит от заданных значений для comment_prefix и inline_comment_prefix.
-
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()теперь итерирует по 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()при false параметре raw. Это актуально только при использовании по умолчанию интерполяции.
Объекты 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) для внутреннего хранения значений, отличных от строк, полную функциональность (включая интерполяцию и вывод в файлы) можно достичь только с использованием строковых значений.Этот метод позволяет пользователям назначать значения, отличные от строк, ключам внутри. Это поведение не поддерживается и приведет к ошибкам при попытке записи в файл или получении в не-сыром режиме. Используйте API протокола отображения, который не допускает таких назначений.
-
Исключения
-
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,10,11) -
Парсеры конфигурации позволяют для значительной настройки. Если вас интересует изменение поведения, описанного в примечании, обратитесь к разделу Настройка поведения парсера.
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/configparser.html