Python 標準庫的 ConfigParser 模塊提供一套 API 來讀取和操作配置文件,因爲是標準庫中的模塊,所以無需下載安裝。
一、配置文件的格式
1. 配置文件中包含一個或多個 section, 每個 section 有自己的 一個或多個option;
2. section 用 [sect_name] 表示,每個option是一個鍵值對,使用分隔符 = 或 : 隔開,多用 = ;
3. 在 option 分隔符兩端的空格會被忽略掉;
4. 配置文件使用 # 註釋;
一個簡單的配置文件示例api.conf,下文示例也都以這個配置文件來操作示範:
[db]
db_port = 80
db_host = 192.168.10.200
db_user = root
db_pwd = 123456
switch = True
[HTTP]
scheme = http
host = www.baidu.com
port = 80
timeout = 1.0
二、configparser模塊的一些問題
1.不能區分option的大小寫;
2.重新寫入的配置文件不能保留原有文件的註釋;
3.重新寫入的配置文件不能保持原有的順序;
4.不支持嵌套;
5.不支持格式校驗;
三、configparser 的基本操作
1、操作配置文件的第一步,實例化 configparser 並加載配置文件
cf = configparser.ConfigParser()
cf.read("api.conf", encoding='utf-8')
2、讀取 section 列表、option 鍵列表和 option 鍵值元組列表
sections = cf.sections() #獲取配置文件api.conf的所有section
print(sections) #打印結果是:['db', 'HTTP']
db_options = cf.options('db') #獲取section爲db下的所有option
print(db_options) #打印結果是:['db_port', 'db_host', 'db_user', 'db_pwd', 'switch']
values = cf.items('HTTP') #獲取section爲HTTP下的所有option鍵值對
print(values) #打印結果是:[('scheme', 'http'), ('baseurl', 'api.jiuji.com'), ('port', '80'), ('timeout', '1.0')]
3、讀取指定的配置信息,此種讀取方式獲得的值均爲字符串str類型
db_host_val = cf.get('db', 'db_host') #讀取配置文件中db_host對應的值value
print(db_host_val) #打印結果是: 192.168.10.200
4、按類型讀取指定的配置信息,使用getint()、 getfloat() 和 getboolean()方法
port = cf.get('HTTP', 'port')
print(port, type(port)) #打印結果是:80 <class 'str'>
port = cf.getint('HTTP', 'port')
print(port, type(port)) #打印結果是:80 <class 'int'>
timeout = cf.getfloat('HTTP', 'timeout')
print(timeout, type(timeout)) #打印結果是:1.0 <class 'float'>
switch = cf.getboolean('db', 'switch')
print(switch, type(switch)) #打印結果是:True <class 'bool'>
5、判斷 section 是否存在
print(cp.has_section('db')) #打印結果是: True
6、添加 section
cf.add_section('new_section') #在配置文件中增加一個新的section,section名重複會報錯
7、刪除 section
cf.remove_section('db') #刪除名爲db的section下所有配置
8、判斷 option 是否存在
print(cf.has_option('db', 'db_host')) #打印結果是:True
9、修改option對應的值,或添加一個option,都用set()方法
cf.set('db', 'db_host', '192.168.0.1') #修改db_host的值爲192.168.0.1
print(cf.get('db', 'db_host')) #打印結果是:192.168.0.1
cf.set('db', 'db_name', 'api_db') #在db下添加一個鍵爲da_name的option,對應值爲api_db
10、刪除option
cf.remove_option('db', 'switch') #刪除switch一項
print(cf.options('db')) #打印結果是:['db_port', 'db_host', 'db_user', 'db_pwd'],少了switch一項
11、保存配置。上述的set、 remove_option、 add_section 和 remove_section 等操作並不會將修改結果保存到配置文件,這時我們用 write 方法將修改的配置保存到文件中
cf.write(open('api.conf', 'w'))
四、其他的一些操作
1、allow_no_value
通常情況下, option 是一個鍵值對。但是,當 ConfigParser的參數 allow_no_value 設置成 True 時,它允許 option 不設置值而只是作爲一個標識。
import configparser
cf = configparser.ConfigParser(allow_no_value=True) #allow_no_value設置爲True
cf.read("api.conf")
cf.set('db', 'db_test') #我們給db下新增一個沒有值的option:db_test
print(cf.get('db', 'db_test')) #再獲取option:db_test的值,會發現打印的值是None
cf.write(open('api.conf', 'w'))
2、DEFAULT section
如果配置文件中存在一個名爲 DEFAULT 的 section,那麼其他 section 會擴展DEFAULT的 option 並且可以覆蓋它的 option。
#新造一個配置文件api.conf
[DEFAULT]
host = 127.0.0.1
port = 3306
[db]
db_port = 80
db_host = 192.168.0.1
db_user = root
db_pwd = 123456
[HTTP]
scheme = http
baseurl = api.jiuji.com
port = 80
timeout = 1.0
host = 192.168.255.255
再看下面語句的執行結果
print(cf.get('DEFAULT', 'host')) #結果:127.0.0.1
print(cf.get('db', 'host')) #結果:127.0.0.1
print(cf.get('HTTP', 'host')) ##結果:192.168.255.255
3、插值 Interpolation
這個不好 用文字來描述,看示例:
#我們再新造一個配置文件api.conf
[DEFAULT]
url = %(protocol)s://%(server)s:%(port)s/
[http]
protocol = http
server = localhost
port = 8080
[ftp]
url = %(protocol)s://%(server)s/
protocol = ftp
server = 192.168.1.102
再看下語句的執行結果
import configparser
cf = configparser.ConfigParser()
cf.read("api.conf", encoding='GBK')
print(cf.get('http', 'url')) #結果:http://localhost:8080/
print(cf.get('ftp', 'url')) #結果:ftp://192.168.1.102/
4、configparser還有其他的一些特性,請參照官方文獻:https://docs.python.org/3/library/configparser.html