configparser — 操作配置文件工具
优质
小牛编辑
133浏览
2023-12-01
配置文件格式
# This is a simple example with comments.
[bug_tracker]
url = http://localhost:8080/bugs/
username = dhellmann
; You should not store passwords in plain text
; configuration files.
password = SECRET
读取配置文件
# configparser_read.py
from configparser import ConfigParser
parser = ConfigParser()
parser.read('simple.ini')
print(parser.get('bug_tracker', 'url'))
# configparser_read_many.py
from configparser import ConfigParser
import glob
parser = ConfigParser()
candidates = ['does_not_exist.ini', 'also-does-not-exist.ini',
'simple.ini', 'multisection.ini']
found = parser.read(candidates)
missing = set(candidates) - set(found)
print('Found config files:', sorted(found))
print('Missing files :', sorted(missing))
Unicode Configuration Data
unicode.ini
[bug_tracker]
url = http://localhost:8080/bugs/
username = dhellmann
password = ßéç®é†
# configparser_unicode.py
from configparser import ConfigParser
import codecs
parser = ConfigParser()
# Open the file with the correct encoding
parser.read('unicode.ini', encoding='utf-8')
password = parser.get('bug_tracker', 'password')
print('Password:', password.encode('utf-8'))
print('Type :', type(password))
print('repr() :', repr(password))
访问配置设置
[bug_tracker]
url = http://localhost:8080/bugs/
username = dhellmann
password = SECRET
[wiki]
url = http://localhost:8080/wiki/
username = dhellmann
password = SECRET
# configparser_structure.py
from configparser import ConfigParser
parser = ConfigParser()
parser.read('multisection.ini')
for section_name in parser.sections():
print('Section:', section_name)
print(' Options:', parser.options(section_name))
for name, value in parser.items(section_name):
print(' {} = {}'.format(name, value))
print()
# configparser_structure_dict.py
from configparser import ConfigParser
parser = ConfigParser()
parser.read('multisection.ini')
for section_name in parser:
print('Section:', section_name)
section = parser[section_name]
print(' Options:', list(section.keys()))
for name in section:
print(' {} = {}'.format(name, section[name]))
print()
测试值是否存在
# configparser_has_section.py
from configparser import ConfigParser
parser = ConfigParser()
parser.read('multisection.ini')
for candidate in ['wiki', 'bug_tracker', 'dvcs']:
print('{:<12}: {}'.format(
candidate, parser.has_section(candidate)))
# configparser_has_option.py
from configparser import ConfigParser
parser = ConfigParser()
parser.read('multisection.ini')
SECTIONS = ['wiki', 'none']
OPTIONS = ['username', 'password', 'url', 'description']
for section in SECTIONS:
has_section = parser.has_section(section)
print('{} section exists: {}'.format(section, has_section))
for candidate in OPTIONS:
has_option = parser.has_option(section, candidate)
print('{}.{:<12} : {}'.format(
section, candidate, has_option))
print()
值类型
# types.ini
[ints]
positive = 1
negative = -5
[floats]
positive = 0.2
negative = -3.14
[booleans]
number_true = 1
number_false = 0
yn_true = yes
yn_false = no
tf_true = true
tf_false = false
onoff_true = on
onoff_false = false
# configparser_value_types.py
from configparser import ConfigParser
parser = ConfigParser()
parser.read('types.ini')
print('Integers:')
for name in parser.options('ints'):
string_value = parser.get('ints', name)
value = parser.getint('ints', name)
print(' {:<12} : {!r:<7} -> {}'.format(
name, string_value, value))
print('\nFloats:')
for name in parser.options('floats'):
string_value = parser.get('floats', name)
value = parser.getfloat('floats', name)
print(' {:<12} : {!r:<7} -> {:0.2f}'.format(
name, string_value, value))
print('\nBooleans:')
for name in parser.options('booleans'):
string_value = parser.get('booleans', name)
value = parser.getboolean('booleans', name)
print(' {:<12} : {!r:<7} -> {}'.format(
name, string_value, value))
# configparser_custom_types.py
from configparser import ConfigParser
import datetime
def parse_iso_datetime(s):
print('parse_iso_datetime({!r})'.format(s))
return datetime.datetime.strptime(s, '%Y-%m-%dT%H:%M:%S.%f')
parser = ConfigParser(
converters={
'datetime': parse_iso_datetime,
}
)
parser.read('custom_types.ini')
string_value = parser['datetimes']['due_date']
value = parser.getdatetime('datetimes', 'due_date')
print('due_date : {!r} -> {!r}'.format(string_value, value))
Options as Flags
# configparser_allow_no_value.py
import configparser
# Require values
try:
parser = configparser.ConfigParser()
parser.read('allow_no_value.ini')
except configparser.ParsingError as err:
print('Could not parse:', err)
# Allow stand-alone option names
print('\nTrying again with allow_no_value=True')
parser = configparser.ConfigParser(allow_no_value=True)
parser.read('allow_no_value.ini')
for flag in ['turn_feature_on', 'turn_other_feature_on']:
print('\n', flag)
exists = parser.has_option('flags', flag)
print(' has_option:', exists)
if exists:
print(' get:', parser.get('flags', flag))
修改设置
# configparser_populate.py
import configparser
parser = configparser.SafeConfigParser()
parser.add_section('bug_tracker')
parser.set('bug_tracker', 'url', 'http://localhost:8080/bugs')
parser.set('bug_tracker', 'username', 'dhellmann')
parser.set('bug_tracker', 'password', 'secret')
for section in parser.sections():
print(section)
for name, value in parser.items(section):
print(' {} = {!r}'.format(name, value))
# configparser_remove.py
from configparser import ConfigParser
parser = ConfigParser()
parser.read('multisection.ini')
print('Read values:\n')
for section in parser.sections():
print(section)
for name, value in parser.items(section):
print(' {} = {!r}'.format(name, value))
parser.remove_option('bug_tracker', 'password')
parser.remove_section('wiki')
print('\nModified values:\n')
for section in parser.sections():
print(section)
for name, value in parser.items(section):
print(' {} = {!r}'.format(name, value))
保存配置文件
# configparser_write.py
import configparser
import sys
parser = configparser.ConfigParser()
parser.add_section('bug_tracker')
parser.set('bug_tracker', 'url', 'http://localhost:8080/bugs')
parser.set('bug_tracker', 'username', 'dhellmann')
parser.set('bug_tracker', 'password', 'secret')
parser.write(sys.stdout)
Option Search Path
[DEFAULT]
file-only = value from DEFAULT section
init-and-file = value from DEFAULT section
from-section = value from DEFAULT section
from-vars = value from DEFAULT section
[sect]
section-only = value from section in file
from-section = value from section in file
from-vars = value from section in file
# configparser_defaults.py
import configparser
# Define the names of the options
option_names = [
'from-default',
'from-section', 'section-only',
'file-only', 'init-only', 'init-and-file',
'from-vars',
]
# Initialize the parser with some defaults
DEFAULTS = {
'from-default': 'value from defaults passed to init',
'init-only': 'value from defaults passed to init',
'init-and-file': 'value from defaults passed to init',
'from-section': 'value from defaults passed to init',
'from-vars': 'value from defaults passed to init',
}
parser = configparser.ConfigParser(defaults=DEFAULTS)
print('Defaults before loading file:')
defaults = parser.defaults()
for name in option_names:
if name in defaults:
print(' {:<15} = {!r}'.format(name, defaults[name]))
# Load the configuration file
parser.read('with-defaults.ini')
print('\nDefaults after loading file:')
defaults = parser.defaults()
for name in option_names:
if name in defaults:
print(' {:<15} = {!r}'.format(name, defaults[name]))
# Define some local overrides
vars = {'from-vars': 'value from vars'}
# Show the values of all the options
print('\nOption lookup:')
for name in option_names:
value = parser.get('sect', name, vars=vars)
print(' {:<15} = {!r}'.format(name, value))
# Show error messages for options that do not exist
print('\nError cases:')
try:
print('No such option :', parser.get('sect', 'no-option'))
except configparser.NoOptionError as err:
print(err)
try:
print('No such section:', parser.get('no-sect', 'no-option'))
except configparser.NoSectionError as err:
print(err)
Combining Values with Interpolation
[bug_tracker]
protocol = http
server = localhost
port = 8080
url = %(protocol)s://%(server)s:%(port)s/bugs/
username = dhellmann
password = SECRET
# configparser_interpolation.py
from configparser import ConfigParser
parser = ConfigParser()
parser.read('interpolation.ini')
print('Original value :', parser.get('bug_tracker', 'url'))
parser.set('bug_tracker', 'port', '9090')
print('Altered port value :', parser.get('bug_tracker', 'url'))
print('Without interpolation:', parser.get('bug_tracker', 'url',
raw=True))
Using Defaults
[DEFAULT]
url = %(protocol)s://%(server)s:%(port)s/bugs/
protocol = http
server = bugs.example.com
port = 80
[bug_tracker]
server = localhost
port = 8080
username = dhellmann
password = SECRET
# configparser_interpolation_defaults.py
from configparser import ConfigParser
parser = ConfigParser()
parser.read('interpolation_defaults.ini')
print('URL:', parser.get('bug_tracker', 'url'))
Substitution Errors
# configparser_interpolation_recursion.py
import configparser
parser = configparser.ConfigParser()
parser.add_section('sect')
parser.set('sect', 'opt', '%(opt)s')
try:
print(parser.get('sect', 'opt'))
except configparser.InterpolationDepthError as err:
print('ERROR:', err)
# configparser_interpolation_error.py
import configparser
parser = configparser.ConfigParser()
parser.add_section('bug_tracker')
parser.set('bug_tracker', 'url',
'http://%(server)s:%(port)s/bugs')
try:
print(parser.get('bug_tracker', 'url'))
except configparser.InterpolationMissingOptionError as err:
print('ERROR:', err)
转义特殊字符
[escape]
value = a literal %% must be escaped
# configparser_escape.py
from configparser import ConfigParser
import os
filename = 'escape.ini'
config = ConfigParser()
config.read([filename])
value = config.get('escape', 'value')
print(value)
Extended Interpolation
# configparser_extendedinterpolation.py
from configparser import ConfigParser, ExtendedInterpolation
parser = ConfigParser(interpolation=ExtendedInterpolation())
parser.read('extended_interpolation.ini')
print('Original value :', parser.get('bug_tracker', 'url'))
parser.set('intranet', 'port', '9090')
print('Altered port value :', parser.get('bug_tracker', 'url'))
print('Without interpolation:', parser.get('bug_tracker', 'url',
raw=True))
Disabling Interpolation
# configparser_nointerpolation.py
from configparser import ConfigParser
parser = ConfigParser(interpolation=None)
parser.read('interpolation.ini')
print('Without interpolation:', parser.get('bug_tracker', 'url'))