快速開始
# demo.ini
[DEFAULT]
ServerAliveInterval = 45
Compression = yes
CompressionLevel = 9
ForwardX11 = yes
[bitbucket.org]
User = hg
[topsecret.server.com]
Port = 50022
ForwardX11 = no
上面的demo.ini是一個非常基礎的配置檔案,它由多個部分(section)組成,每部分包含了帶值的選項。ConfigParse類的例項可以對其進行讀寫操作。
建立配置檔案:
import configparser
config = configparser.ConfigParser()
config["DEFAULT"] = {"ServerAliveInterval": "45",
"Compression": "yes",
"CompressionLevel": "9",
"ForwardX11": "yes"}
config["bitbucket.org"] = {}
config["bitbucket.org"]["User"] = "hg"
config[`topsecret.server.com`] = {}
topsecret = config[`topsecret.server.com`]
topsecret["Port"] = "50022"
topsecret["ForwardX11"] = "no"
with open("demo.ini", "w") as configfile:
config.write(configfile)
對配置解析器的處理與字典類似。
讀取配置檔案:
>>> config = configparser.ConfigParser()
>>> config.sections()
[]
>>> config.read("demo.ini")
["demo.ini"]
>>> config.sections()
[`bitbucket.org`, `topsecret.server.com`]
>>> "bitbucket.org" in config
True
>>> "bitbong.com" in config
False
>>> config["bitbucket.org"]["User"]
"hg"
>>> config[`DEFAULT`][`Compression`]
"yes"
>>> topsecret = config[`topsecret.server.com`]
>>> topsecret[`ForwardX11`]
"no"
>>> for key in config["bitbucket.org"]:
... print(key)
user
serveraliveinterval
compression
compressionlevel
forwardx11
>>> config["bitbucket.org"]["ForwardX11"]
"yes"
注意點:[DEFAULT]為其他所有section提供預設值,section中的所有鍵大小寫不敏感並以小寫字母儲存
支援的資料型別
配置解析器總是儲存配置的值為字串型別,因此使用者需要按需轉換為期望的資料型別。由於這種需求非常普遍,配置解析器提供了一系列更簡便的方法來處理整數(getint()
)、浮點數(getfloat()
)及布林值(getboolean()
)。使用者也可以自行註冊轉換器或定製配置解析器已提供的轉換器。
>>> topsecret.getboolean(`ForwardX11`)
False
>>> config[`bitbucket.org`].getboolean(`ForwardX11`)
True
>>> config.getboolean(`bitbucket.org`, `Compression`)
True
注意點:getboolean()
方法對大小寫不敏感,能識別`yes`/`no`, `on`/`off`, `true`/`false`和`1`/`0`為對應的布林值
後備值(Fallback Values)
和字典一樣,可以使用section的get()
方法提供後備值:
>>> topsecret.get(`CompressionLevel`)
`9`
>>> topsecret.get(`Cipher`)
>>> topsecret.get(`Cipher`, `3des-cbc`)
`3des-cbc
需要注意的是,預設值的優先順序高於後備值。比如要想在`topsecret.server.com`中獲取`CompressionLevel`的值,即使指定了後備值,仍然得到的是`DEFAULT`中的值:
>>> topsecret.get(`CompressionLevel`, `3`)
`9`
此外,除了section的get()
方法,還提供瞭解析器級別的get()
方法,支援向後相容,後備值通過fallback
關鍵字指定:
>>> config.get("bitbucket.org", "monster", fallback="No such things as monsters")
"No such things as monsters"
fallback
關鍵字同樣支援在getint()
, getfloat()
和getboolean()
中使用
支援的INI檔案結構
- 配置檔案由section組成,每個section以
[section_name]
的形式打頭,後跟以特定字元(預設是=
或:
)分隔的鍵值對。 - 預設情況下section名稱區分大小寫,鍵不區分大小寫。
- 鍵、值的頭部和尾部空格自動移除。
- 值可以省略,在這種情況下分隔符也可以不要。
- 值可以跨多行,只要其他行的值比第一行的值縮排更深。
- 空行可以被忽略或視作多行值的一部分(取決於解析器模式)。
- 可以包含註解,獨佔一行顯示,預設以字元
#
和;
為字首。應該避免註解與鍵或值處在同一行,因為這將導致把註解視為值的一部分。
[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
預設使用的Interpolation類。允許值包含格式化字串,該字串引用同一section中的值或DEFAULTSECT
section中的值。其他預設值可以在初始化時提供。
[Paths]
home_dir: /Users
my_dir: %(home_dir)s/lumberjack
my_pictures: %(my_dir)s/Pictures
在上面的例子中,interpolation設定為BasicInterpolation()
的ConfigParser將解析%(home_dir)s
為home_dir
的值,%(my_dir)s
將解析為/Users/lumberjack
。引用鏈中使用的鍵不需要在配置檔案中以任何特定的順序指定。
如果interpolation設定為None
,將直接返回%(home_dir)s/lumberjack
作為my_dir
的值。
class configparser.ExtendedInterpolation
擴充套件的Interpolation類,實現了更高階的語法。它使用${section:option}
表示來自外部section的值,如果省去了section:
,預設指當前section(以及可能的DEFAULTSECT
section的值)
[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}
對映協議訪問
對映協議訪問是允許像操作字典一樣使用自定義物件的功能的通用名稱。在configparser中,對映介面通過parser["section"]["option"]
的形式實現。
parser["section"]
返回解析器中section的值的代理,值從原始解析器中獲取但並非通過複製的方式。在section代理上改變值的操作,實際上是對原始解析器的改變。
configparser物件雖然表現的儘可能接近字典,但仍有一些區別需要注意:
- 預設情況下,section中的所有key能夠以大小寫不敏感的方式訪問。例如
for option in parser["section"]
語句生成的option名稱總是被optionxform
函式轉換為小寫。擁有”a”選項的section通過以下兩種方式訪問都將返回True:
"a" in parser["section"]
"A" in parser["section"]
- 所有section都包含
DEFAULTSECT
的值,也就是說,對section的.clear()
操作可能並沒有真正的清空,這是因為無法從該section刪除預設值。在除DEFAULTSECT
以外的section上刪除預設值(前提是沒有對預設值重寫)將丟擲KeyError
異常
>>> del topsecret["forwardx11"]
>>> topsecret["forwardx11"]
`yes`
>>> del topsecret["serveraliveinterval"]
Traceback (most recent call last):
...
raise KeyError(key)
KeyError: `serveraliveinterval`
-
DEFAULTSECT
不能從解析器移除- 刪除它將丟擲
ValueError
異常 -
parser.clear()
操作對它沒有任何影響 -
parser.popitem()
不會返回DEFAULTSECT
- 刪除它將丟擲
>>> del config["DEFAULT"]
Traceback (most recent call last):
...
raise ValueError("Cannot remove the default section.")
ValueError: Cannot remove the default section.
>>> config.clear()
>>> config["DEFAULT"]["serveraliveinterval"]
`45`
-
parser.get(section, option, **kwargs)
– 第二個引數並非字典的get()
方法表示的後備值,但section級別的get()
方法與對映協議卻是相容的 -
parser.items(raw=False, vars=None)
相容對映協議(返回包含DEFAULTSECT
的(section_name, section_proxy)對的列表)。另有指定section的呼叫方式:parser.items(section, raw=False, vars=None)
.後者返回指定section的(option, value)對的列表,raw引數指定value中的格式化字串是否插值表示
>>> list(config.items())
[(`DEFAULT`, <Section: DEFAULT>), (`bitbucket.org`, <Section: bitbucket.org>), (`topsecret.server.com`, <Section: topsecret.server.com>)]
>>> list(config.items("bitbucket.org"))
[(`serveraliveinterval`, `45`), (`compression`, `yes`), (`compressionlevel`, `9`), (`forwardx11`, `yes`), (`user`, `hg`)]
自定義解析器行為
省略
舊版API示例
省略
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()
返回包含例項範圍預設值的字典
sections()
返回可用section的名稱列表(不包含預設section的名稱)
add_section(section)
新增section。如果該section已經存在,丟擲DuplicateSectionError
異常;如果傳入的是預設section的名稱,丟擲ValueError
異常;如果傳入的引數不是字串型別,丟擲TypeError
異常
has_section(section)
判斷section是否存在。預設section總是返回False
options(section)
返回指定section的可用選項列表(包含DEFAULTSECT
中的選項)。指定預設section將丟擲NoSectionError
異常
has_option(section, option)
如果section存在且包含指定的option,返回True,否則返回False。如果傳遞的section為None
或""
,視為預設section
read(filenames, encoding=None)
讀取並解析可迭代的檔名,返回成功解析的檔名列表
如果filenames是一個字串,或位元組物件又或者是類路徑物件,視其為單個檔案。如果filenames中的某個檔案不能開啟,該檔案將被忽略
如果filenames中所有檔案都不存在,ConfigParser例項將包含空資料集。如果某個應用需要匯入初始化值,應該在呼叫read()匯入可選配置檔案前呼叫read_file()
讀取相應的初始化配置檔案,因為read_file()
讀取不能開啟的檔案時會丟擲FileNotFoundError
異常,而不會直接忽略
import configparser, os
config = configparser.ConfigParser()
config.read_file(open(`defaults.cfg`))
config.read([`site.cfg`, os.path.expanduser(`~/.myapp.cfg`)],
encoding=`cp1250`)
read_file(f, source=None)
從可迭代生成Unicode字串的f(例如以文字模式開啟的檔案物件)讀取及解析配置資料
read_string(string, source=`<string>`)
從字串中解析配置資料
read_dict(dictionary, source=`<dict>`)
從提供類似dict的items()方法的物件載入配置。key是section名稱,value是包含選項和值的字典。如果使用的字典型別支援保留順序,section及其選項將按序新增,所有值自動轉換為字串
get(section, option, * , raw=False, vars=None[, fallback])
獲取指定section的選項的值。vars引數作為字典物件傳遞。option按照vars,section,DEFAULTSECT的順序進行查詢,如果不存在且提供了fallback引數,返回fallback的值,fallback可以是None
raw引數指定value中的格式化字串是否插值表示,與option的查詢順序相同
getint(section, option, * , raw=False, vars=None[, fallback])
轉換option的值為int型別
getfloat(section, option, * , raw=False, vars=None[, fallback])
轉換option的值為float型別
getboolean(section, option, * , raw=False, vars=None[, fallback])
轉換option的值為bool型別
items(raw=False, vars=None)
items(section, raw=False, vars=None)
前者返回包含DEFAULTSECT
的(section_name, section_proxy)對的列表。後者返回指定section的(option, value)對的列表
set(section, option, value)
如果section存在,設定option的值為value,否則丟擲NoSectionError
異常。option和value必須是字串型別,否則丟擲TypeError
異常
write(fileobject, space_around_delimiters=True)
將ConfigParser物件寫入以檔案模式開啟的檔案。
remove_option(section, option)
從section中移除指定的選項。如果section不存在,丟擲NoSectionError
異常。如果option存在返回True,否則返回False
remove_section(section)
移除指定section。如果section存在返回True,否則返回False(對預設section的操作總是返回False)
optionxform(option)
對option的處理函式,預設返回option的小寫形式。可以通過繼承重寫或設定ConfigParser例項的optionxform
屬性(接收一個字串引數並返回一個新的字串的函式)改變預設行為。
cfgparser = ConfigParser()
cfgparser.optionxform = str
讀取配置檔案時,option兩邊的空格在呼叫此函式前先被移除
readfp(fp, filename=None)
已棄用,使用 read_file()
替代
configparser.MAX_INTERPOLATION_DEPTH
當raw引數為false時,get()方法遞迴插值的最大深度。僅在使用預設的BasicInterpolation
時才有意義
RawConfigParser物件
省略
異常
省略