Python configparser

Для работы с файлами конфигурации в Питоне существует чрезвычайно полезный модуль — ConfigParser

модуль может работать с файлами конфигурации аналогичными виндовым ini файлам

1. Быстрый старт:

пусть у нас есть конфиг файл такого вида:
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[bitbucket.org]
User = hg
[topsecret.server.com]
Port = 50022
ForwardX11 = no
Упрощенно структура конфиг-файла следующая — файл состоит из секций, каждая из которых содержит ключи со значениями. Классы конфигпарсера могут читать и писать подобные файлы.
попробуем создать вышеприведенный файл программно.
Открываем IDLE (у меня — консоль PyCharm)
    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)
Словарь в общем
Теперь давайте его перечитаем:
>>> 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, который предоставляет значения по умолчанию для всех прочих разделов.
Ключи в разделах чувствительны к регистру

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

Конфигпарсер понятия не имеет о типах данных в файлах конфигурации и потому хранит их в виде строк. Такшта если нужны прочие типы данных — надо будет их приводить в нужном направлении.
>>> int(topsecret[‘Port’])
50022
>>> float(topsecret[‘CompressionLevel’])
9.0
Так как задача приведения типов из конфига является более чем распространенной конфигпарсер предоставляет широкий выбор методов обработки для int, float и bool. Последний является наиболее интересным, потому как от обычного варианта bool() толку не будет — bool(‘False’) будет возвращать True. Поэтому в конфигпарсере используется getboolean(). Этот метод нечуствителен к регистру и правильно переваривает такие варианты как yes’/’no’, ‘on’/’off’, ‘true’/’false’ и ‘1’/’0′
>>> topsecret.getboolean(‘ForwardX11’)
False
>>> config[‘bitbucket.org’].getboolean(‘ForwardX11’)
True
>>> config.getboolean(‘bitbucket.org’, ‘Compression’)
True
Помимо getboolean() конфигпарсер содержит аналогичные методы getint() и getfloat(). Ну и естественно можно насочинять своих собственных преобразователей.

3. Запасные варианты

как и в словаре, можно использовать 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 кириллицей выдал ошибку)
Аналогично fallback может быть использован с getint(), getfloat(), getboolean():
>>> ‘BatchMode’ in topsecret
False
>>> topsecret.getboolean(‘BatchMode’, fallback=True)
True
>>> config[‘DEFAULT’][‘BatchMode’] = ‘no’
>>> topsecret.getboolean(‘BatchMode’, fallback=True)
False

4 Поддерживаемые структуры инишников

Файл конфигурации состоит из секций, каждая из которых состоит из заголовка [section] , а затем записи ключ / значение , разделенных символом ( = или : по умолчанию [1] ). По умолчанию имена разделов чувствительны к регистру , но ключи не являются [1] . Начальные и конечные пробелы удаляются из ключей и значений. Значения могут быть опущены, и в этом случае ключ/значение, также могут быть опущены.(То есть являются необязательными). Значения также могут занимать несколько строк, нужно сделать более глубокий отступ. Uлубже, чем в первой строке значения. В зависимости от режима работы парсера, пустые строки могут рассматриваться как части многострочных значений или игнорироваться.
Файлы конфигурации могут включать в себя комментарии, начинающиеся с помощью специальных символов (# и ; по умолчанию). Комментарии могут начинаться с новой строки, возможно, с отступом.
Например:
[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?

5 Интерполяция значений

ConfigParser поддерживает интерполяцию значений, то есть он может формировать значения на основании строк, которые относятся к другим значениям  в том же разделе или в специальном разделе по умолчанию. Дополнительные значения по умолчанию могут быть предоставлены при инициализации.
пример:
[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures
В приведенном примере ConfigParser с интерполяцией BasicInterpolation() подставит вместо home_dir ее значение — в данном случае /Users, вместо my_dir будет подставлено /Users//lumberjack
Все интерполяции выполняются по требованию, так что ключи, используемые в цепочке ссылок не должны быть указаны в беспорядочном порядке.
Если interpolation установить в значение None парсер просто вернет значение как понаписано в файле — %(my_dir)s/Pictures для ключа my_pictures и %(home_dir)s/lumberjack для ключа my_dir
Класс 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}

7 Пользовательская настройка поведения парсера

Существует столько вариантов формата ini сколько приложений, использующих его. ConfigParser прошел долгий путь, чтобы обеспечить поддержку самого большого разумного набора стилей. Функциональность продиктована историческим развитием и возможно вы захотите настроить некоторые из его функций.
Самый распространненый способ изменения конкретного анализатора конфигураций  — использование опций __init__():
— defaults значение по умолчанию None
Этот параметр принимает словарь пар ключ-значение, который будут изначально заложены в DEFAULT разделе. Элегантный способ поддержки кратких конфигурационных файлов, которые не переопределяют значения по умолчанию.
— 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)
>>> # 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’
— delimeters, значение по умолчанию: (‘=’, ‘:’)
deliveters (разделитель)  — ограничитель подстроки, которые разграничивают ключи и значения в пределах раздела. Первое появление символа делимитера в подстроке считается разделителем. Это означает, что значения (но не ключи)
см также аргумент space_around_delimiters в ConfigParser.write()
— comment_prefixes, значение по умолчанию: (‘#’, ‘;’)
— inline_comment_prefixes, значение по умолчанию: None
Префикс строки комментария, который указывает на действительное начало комментария в конфигурационном файле. Могут использоваться для создания комментариев после каждого допустимого значения.  По умолчанию встроенные комментарии отключены и comment_prefixes используются только для в качестве префиксов для полнострочных комментариев.
(изменено в версии 3,2, в предыдущих версиях configparser по умочанию  comment_prefixes=(‘#’,’;’) и inline_comment_prefixes=(‘;’,)  )
Обратите внимание, что configparser не поддерживает экранирование префиксов комментариев. При любых обстоятельствах, единственный способ хранения префиксных коммент-символов в начале строки — интерполировать префикс, например:
>>> 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
Если установлено strict=True парсер не позволит какой-либо секции или опции дублироваться во время чтения из одного источника. (с использованием read_file(), read_string() или read_dict()). Рекомендуется использовать в новых приложениях.
(было изменено в версии 3,2, в более старых версиях поведение соответствует 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, значение по умолчанию: не установлено
ConfigParser предоставляют значение опции конвертерам, которые выполняют преобразование типов. По умолчанию реализованы 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’]
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’]

8 Примеры работы с устаревшим API

Из соображений обратной совместимости configparser поддерживает устаревший API с явными вызовами get() и set() методов. Устаревший API порой более продвинутый, более низкого уровня и совершенно противоречит здравому смыслу.
пример записи в конфиг:
import configparser
config = configparser.RawConfigParser()
# Обратите внимание, что с помощью функции множества RawConfigParser, вы можете назначить
# нестроковые значения для ключей внутренне, но получит сообщение об ошибке при
# попытке записи в файл или когда вы получаете его в режиме непервичной настройки
# значения, используя протокол отображения или набор. ConfigParser не позволяет
# отмачивать такие приколы.
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’ or ‘%(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 is fun!»
print(cfg.get(‘Section1’, ‘foo’, raw=True))   # -> «%(bar)s is %(baz)s!»
# Опциональный *vars* аргумент является словарем, с членами, которые будут задавать
# интерполяцию.
print(cfg.get(‘Section1’, ‘foo’, vars={‘bar’: ‘Documentation’,
                                       ‘baz’: ‘evil’}))
# Опциональный *fallback* аргумент может быть использован для задания резервного значения
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.»
# print(cfg.get(‘Section1’, ‘monster’)) вызовет NoOptionError
# Но мы также можем использовать:
print(cfg.get(‘Section1’, ‘monster’, fallback=None))
      # -> None
Значения по умолчанию доступны в обоих типах ConfigParser. Они используются в интерполяции, если параметр не определен в другом месте.
import configparser
# Новый экземпляр ‘bar’ и ‘baz’ с значениями по умолчанию ‘Life’ и ‘hard’ для каждого
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!»

9 Объекты ConfigParser

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={})
Основная конфигурация парсера. По умолчанию инициализируется словарем собственных настроек по умолчанию.
Если dict_type задано, оно будет использоваться для создания словаря объектов для списка разделов, для вариантов в секции и для значений по умолчанию.
Если заданы разделители, они используется в качестве множества подстрок , которые разделяют ключи от значений.
Если 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 эквивалентны.
При использовании конвертеров должен быть задан словать, где каждый ключ представляет собой имя типа преобразователя и каждое значение является вызываемая реализации преобразования из строки нужного типа данных. Каждый конвертер получает свой собственный соответствующий 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)
    Попытка прочитать и разобрать список имен файлов, возвращает список имен файлов, которые были успешно проанализированы. Если именем файла является строка, то она рассматривается как единое имя файла. Если файл из списка не может быть открыт, то этот файл будет проигнорирован. Это сделано для того, чтобы можно было указать список потенциальных местоположений файлов конфигурации (например текущий каталог, домашний каталог пользователя, или вообще вся файловая система), а также будет читать все существующие конфигурационные файлы в списке. Если ни один из указанных файлов не существует, то экземпляр ConfigParser будет содержать пустой набор данных. Приложение, которому требуется загрузить начальные значения из файла необходимо предварительно загрузить нужный файл или файлы, используя read_file() перед вызовом read() для этих дополнительных файлов:
import configparser, os
config = configparser.ConfigParser()
config.read_file(open(‘defaults.cfg’))
config.read([‘site.cfg’, os.path.expanduser(‘~/.myapp.cfg’)],
            encoding=’cp1250′)
 Новое в версии 3.2: параметр encoding. Раньше все файлы читались с помощью кодировки по умолчанию open().
read_file(f, source=None)
    Читает и парсит файл конфигурации f, которые должны быть итераторами с получением строки Unicode (например файлы открываются в текстовом режиме).
    Необязательный аргумент источник указывает имя читаемого файла. Если не дано , и f имеет аттрибут name, который используется в качестве источника ; по умолчанию ‘<???>’.
    Новое в версии 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 в таком порядке. Если ключ не найден, и предусмотрен запасной вариант, он используется как значение по умолчанию. None могут быть предоставлены в качестве запасного варианта значения.
    Все ‘%’ интерполяциями расширяются в возвращаемые значения, если raw аргумент установлен в False. Значения для ключей интерполяции отыскиваются таким же образом.
    Изменено в версии 3.2: Аргумент raw, vars и запасной вариант(fallback) это ключевое слово только для защиты пользователей от попыток использовать третий аргумент в качестве запасного варианта (особенно при использовании протокола сопоставления).
getint(section, option, *, raw=False, vars=None[, fallback])
    Удобный метод, возвращающий опцию из указанного раздела в виде целого числа.См get()для объяснения raw, vars и fallback.
getfloat(section, option, *, raw=False, vars=None[, fallback])
    Удобный метод, возвращающий данные конфига в виде числа с плавающей точкой.См get()для описания raw, vars и fallback().
getboolean(section, option, *, raw=False, vars=None[, fallback])
    Удобный метод, возвращающий опции из указанного раздела в виде логического значения. Следует отметить, что принятые значения для опции являются ‘1’, ‘yes’, ‘true’, и ‘on’, чтобы вернуть True, и ‘0’, ‘no’, ‘false’, и ‘off’, чтобы вернуть False. Эти значения строки проверяются в зависимости от регистра. Любое другое значение выдаст ValueError .См get() для описания raw, vars и fallback().
items(raw=False, vars=None)
items(section, raw=False, vars=None)
    Если раздел(section) не задан, возвращает список имен секций SECTION_NAME, section_proxy пар, в том числе DEFAULTSECT.
    В противном случае, возвращает список имя, значение пар для опций в данном разделе. Необязательные аргументы имеют тот же смысл, что и для get() метода.
    Изменено в версии 3.2: Элементы, присутствующие в vars больше не появляются в результате. Прежнее поведение смешивало фактические параметры анализатора с переменными, предусмотренных интерполяцией.
set(section, option, value)
    Если данный раздел существует — установите данную опцию в заданное значение; в противном случае выдаст NoSectionError. Опция и значение должны быть строками; если нет, то выдаст ошибку TypeError.
write(fileobject, space_around_delimiters=True)
    записывает конфиг в указаный файл (fileobject), который должен быть открыт в текстовом режиме (разрешающем строки). Такое представление может быть разобрано при последующем вызове read(). Если space_around_delimiters установлено в True, разделяющий символ между ключами и значениями окружены пробелами.
remove_option(section, option)
    Извлекает указанный параметр из указанного раздела. Если раздел не существует, возвращает NoSectionError. Если опция существует, чтобы быть удалены, возвращение True; в противном случае возвращают значение False .
remove_section(section)
    Извлекает указанный раздел из конфигурации. Если раздел на самом деле существовал, возвращает True. В противном случае возвращают значение False.
optionxform(option)
    Превращает вариант названия опции, как найденный во входном файле или как принятый в клиентском коде в форму, которая должна использоваться во внутренних структурах. Реализация по умолчанию возвращает строчную версию варианта; подклассы могут переопределить это или клиентский код может установить атрибут этого имени на случаях повлиять на это поведение.
    Вам не нужен подкласс парсера, чтобы использовать этот метод, вы можете также установить его на экземпляр, к функции, которая принимает строку в качестве аргумента и возвращает строку. Установка в str , например, сделал бы имена параметров чувствительны к регистру:
    cfgparser = ConfigParser()
    cfgparser.optionxform = str
    Обратите внимание, что при чтении конфигурационных файлов, пробелы вокруг имен опций раздели перед тем как вызывается optionxform().
readfp(fp, filename=None)
    Устарел начиная с версии 3.2: Используйте read_file()вместо этого.
    Изменено в версии 3.2: readfp() теперь перебирает на f вместо вызова f.readline().
    Для существующего кода вызывающего readfp()с аргументами, которые не поддерживают итерацию, следующий генератор может быть использован в качестве обертки вокруг файл-подобный объект:
    def readline_generator(f):
        line = f.readline()
        while line:
            yield line
            line = f.readline()
    Вместо parser.readfp(f) используйте parser.read_file(readline_generator(f)).
 configparser.MAX_INTERPOLATION_DEPTH
    Максимальная глубина рекурсивной интерполяции для get(), если исходный параметр является ложным. Это относится только к случаю когда интерполяция используется.

10. Объекты RawConfigParser

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.
    Тип раздела не проверяется, что позволяет пользователям создавать нестроковых названния разделов. Такое поведение не поддерживается и может вызвать внутренние ошибки.
set(section, option, value)
    Если данный раздел существует — установите данную опцию в заданное значение; в противном случае будет выдана NoSectionError. В то время как можно использовать RawConfigParser (или ConfigParser с raw = True) для внутреннего хранения значений нестроковых значений, полная функциональность (включая интерполяции и вывод в файлы) может быть достигнуто только с помощью строковых значений.
    Этот метод позволяет пользователям назначать нестроковых значения внутри ключей. Такое поведение не поддерживается и может привести к ошибкам при попытке записи в файл или получить его в режиме non-raw. Используйте API протокола отображения, который не позволяет такой фигне иметь место.

ИСКЛЮЧЕНИЯ

исключение configparser.Error
    Базовый класс для всех других configparser исключений.
исключение configparser.NoSectionError
    Исключение возникает когда указанный раздел не найден.
исключение configparser.DuplicateSectionError
    Исключение возникает если add_section() вызывается с именем раздела, который уже существует или в строгих анализаторах, когда раздел найден более одного раза в одином входном файле, строке или словаре.
Новое в версии 3.2: Были добавлены необязательные source и lineno атрибуты и аргументы __init__()
исключение configparser.DuplicateOptionError
    Исключение выдается строгими анализаторами, если один параметр отображается дважды во время чтения из одного файла, строки или словаря. Это ловит опечатки и ошибки, связанные с регистрозависимостью. Например словарь может иметь два ключа, представляющих один и тот же ключ конфигурации без учета регистра.
исключение configparser.NoOptionError
    Исключение возникает, когда указанный параметр не найден в указанном разделе.
исключение configparser.InterpolationError
    Базовый класс для исключений, возникающих при интерполяции.
исключение configparser.InterpolationDepthError
    Исключение возникает когда интерполяция не может быть завершена, поскольку количество итераций превышает MAX_INTERPOLATION_DEPTH. Подкласс InterpolationError.
исключение configparser.InterpolationMissingOptionError
    Исключение возникает, когда вариант ссылки из значения не существует. Подкласс InterpolationError.
исключение configparser.InterpolationSyntaxError
    Исключение возникает, когда исходный текст, в которые сделаны замены, не соответствует требуемому синтаксису. Подкласс InterpolationError.
исключение configparser.MissingSectionHeaderError
    Исключение возникает при попытке разобрать файл, который не имеет заголовков разделов.
исключение configparser.ParsingError
    Исключение возникает при возникновении ошибок разбора файла.
    Изменено в версии 3.2:filename атрибут и __init__() аргумент был переименован source для последовательности.

Добавить комментарий