Python: 使用configparser模塊讀寫配置文件(.conf、.ini、.cfg)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章