Python學習——configparser模組
一、概述
在軟體開發過程中,很多時候需要處理配置檔案的讀取解析和改寫,在python中專門處理配置檔案的模組就是configpaser了。顧名思義,configpaser就是配置解析器,可用來對符合格式規範的.conf,ini等配置檔案進行解析讀取,並支援增刪改查、定義新的配置檔案等處理。
二、配置檔案格式規範
可以被configpaser處理的配置檔案需符合以下格式規範:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
character-set-server=utf8
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
細心的同學可發現這就是mysql的預設配置檔案,類似的還有ansible的hosts檔案:
[group1]
host1 var1=value1 var2=value2
host2 var3=value2
[group2]
host3
[group1:children]
group2
三、configpaser的常見用法
前文提到,configpaser支援對配置檔案的解析讀取、增刪改查和定義新的配置檔案等處理,可滿足不同場景下對配置檔案的處理需求,下面我們先來建立一個示例配置檔案,然後逐一詳述讀取和增刪改查用法。
3.1 建立配置檔案
建立示例配置檔案
import configparser
config = configparser.ConfigParser()
# 開始建立第一個section,類似於list賦值方式,值為dict
config['DEFAULT'] = {'compressionlevel': '9',
'serveraliveinterval': '45',
'compression': 'yes'}
config['DEFAULT']['forwardx11'] = 'yes'
# 建立第二個section
config['bitbucket.org'] = {}
# 類似於通過list的下標來賦值元素
config['bitbucket.org']['user'] = 'hg'
config['topsecret.server.com'] = {}
# 通過中間變數來替代
topsecret = config['topsecret.server.com']
topsecret['host port'] = '50022'
topsecret['forwardx11'] = 'no'
# 開始寫入配置檔案
with open('test.conf', 'w', encoding='utf-8') as configfile:
config.write(configfile)
注意:
建立的key-value中裡面如果有數字,需要加引號變成string形式,否則會報資料型別錯誤。
建立的配置檔案顯示如下:
[DEFALUT]
compressionlevel = 9
serveraliveinterval = 45
compression = yes
forwardx11 = yes
[bitbucket.org]
user = hg
[topsecret.server.com]
host port = 50022
forwardx11 = no
3.2 讀取配置檔案
很多場景下我們更多的是需要解析讀取其他軟體的配置檔案,以獲取相關的引數資訊。
- 讀取section
section即符合格式規範的配置檔案的一級目錄,方括號[]包含的部分.sections()方法用於獲取配置檔案的除default外的所有section,以list形式返回。
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.sections() #獲取section
[]
>>> config.read('test.conf') #讀取配置檔案
['test.conf']
>>> config.sections() #成功返回section,但不包括default
['bitbucket.org', 'topsecret.server.com']
>>> config.defaults() #返回default section的鍵值對
OrderedDict([('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'), ('forwardx11', 'yes')])
- 判斷section是否存在
>>> 'bitbucket.org' in config
True
>>> 'bitbucket.org1' in config
False
>>> 'DEFAULT' in config
True
>>>
- 讀取section內的值
獲取某個key對應的value可以以類似於list下標的形式獲取,options()方法可獲取指定section和default在內的所有key,items可獲取指定section和default在內的所有key-value對
>>> config.options('bitbucket.org')
['user', 'compressionlevel', 'serveraliveinterval', 'compression', 'forwardx11']
>>> config.items('bitbucket.org')
[('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'),('forwardx11', 'yes'), ('user', 'hg')]
>>> config['bitbucket.org']['user']
'hg'
>>>
- 迴圈獲取section內的key值
可以通過config[‘section_name’]的方式迴圈獲取,也可以通過options方法迴圈獲取
>>> for key in config['bitbucket.org']:
... print(key)
...
user
compressionlevel
serveraliveinterval
compression
forwardx11
>>>
>>> for key in config.options('bitbucket.org'):
... print(key)
...
user
compressionlevel
serveraliveinterval
compression
forwardx11
3.3 configpaser的增刪改查
- 讀取
主要的讀取方法如下:
引數 | 說明 |
---|---|
-read(filename) | 直接讀取檔案內容 |
-sections() | 得到所有的section,並以列表的形式返回 |
-options(section) | 得到該section的所有option |
-items(section) | 得到該section的所有鍵值對 |
-get(section,option) | 得到section中option的值,返回為string型別 |
-getint(section,option) | 得到section中option的值,返回為int型別,還有相應的getboolean()和getfloat() 函式。 |
import configparser
config = configparser.ConfigParser()
config.read('test.conf')
print(config.sections())
print(config.options('topsecret.server.com'))
print(config.items('topsecret.server.com'))
print(config.get('topsecret.server.com', 'host port'))
print(type(config.get('topsecret.server.com', 'host port')))
print(config.getint('topsecret.server.com', 'host port'))
print(type(config.getint('topsecret.server.com', 'host port')))
輸出:
['bitbucket.org', 'topsecret.server.com']
['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression']
[('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'), ('forwardx11', 'no'), ('host port', '50022')]
50022
<class 'str'>
50022
<class 'int'>
注意:
default是一個特殊的全域性section,我們獲取section時不會返回它,但是當我們在獲取其他section的key或者key-value對時,會包括default相應的內容,可以認為它是一個全域性預設的section把。
- 更改
通過set方式可實現對已有key-value的修改,如果set的物件不存在,則報錯該section不存在
import configparser
config = configparser.ConfigParser()
config.read('test.conf')
print(config.get('topsecret.server.com', 'host port'))
config.set('topsecret.server.com', 'host port' ,'60022')
print(config.get('topsecret.server.com', 'host port'))
結果輸出:
50022
60022
- 增加
新增section:
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.read('test.conf')
['test.conf']
>>> config.has_section('topsecret.server.com')
True
>>> config.has_section('sync_data') #判斷是否有該section
False
>>> config.options('topsecret.server.com')
['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'compress
ion']
>>> config.add_section('sync_data') #新增section
>>> config.sections() #新增成功
['bitbucket.org', 'topsecret.server.com', 'sync_data']
- 新增option:
set還有一種用法是為一個存在的section新增option:
import configparser
config = configparser.ConfigParser()
config.read('test.conf')
print(config.options('topsecret.server.com'))
#新增option autoreload
config.set('topsecret.server.com', 'autoreload' ,'yes')
print(config.options('topsecret.server.com'))
print(config.items('topsecret.server.com'))
程式輸出:
['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression']
['host port', 'forwardx11', 'autoreload', 'compressionlevel', 'serveraliveinterval', 'compression']
[('compressionlevel', '9'), ('serveraliveinterval', '45'), ('compression', 'yes'), ('forwardx11', 'no'), ('host port', '50022'), ('autoreload', 'yes')]
#新增option後可以看到多出autoreload,items也能返回它對應的value
- 刪除
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.read('test.conf')
['test.conf']
>>> config.sections()
['bitbucket.org', 'topsecret.server.com']
#開始刪除section
>>> config.remove_section('bitbucket.org')
True
>>> config.sections()
['topsecret.server.com'] #成功刪除section
>>> config.options('topsecret.server.com')
['host port', 'forwardx11', 'compressionlevel', 'serveraliveinterval', 'com
ion']
#開始刪除option
>>> config.remove_option('topsecret.server.com','host port')
True
>>> config.options('topsecret.server.com')
['forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression'] #成功刪除option
#刪除預設的default的option失敗
>>> config.remove_option('topsecret.server.com','compression')
False
>>> config.options('topsecret.server.com')
['forwardx11', 'compressionlevel', 'serveraliveinterval', 'compression']
注意:如果要刪除default的全域性預設option,必須指定section為default後才能刪除
>>> config.remove_option('DEFAULT','compression')
True
>>> config.options('topsecret.server.com')
['forwardx11', 'compressionlevel', 'serveraliveinterval']
- 持久化儲存
上述增、刪、改的操作都只是處理了記憶體中的物件,並沒有進行持久化儲存,會面臨一個重新read後修改又被回滾的問題,這時切記修改完了要立即進行持久化儲存處理。儲存方法與操作普通檔案非常類似:
>>> import configparser
>>> config = configparser.ConfigParser()
>>> config.read('test.conf')
>>> with open('test.conf','w',encoding='utf-8') as configfile:
... config.write(configfile)
...
>>> config.read('test.conf')
['test.conf']
#持久化儲存後重新讀取,此前的修改已經生效
>>> config.sections()
['topsecret.server.com']
>>> config.options('topsecret.server.com')
['forwardx11', 'compressionlevel', 'serveraliveinterval']
持久化儲存時可指定儲存到原始檔進行覆蓋寫處理,也可以另存為其他檔案。
相關文章
- 【Python】ConfigParser模組Python
- python模組之configparserPython
- Python 解析配置模組之ConfigParserPython
- Python 解析配置模組之ConfigParser詳解Python
- [Python模組學習] glob模組Python
- Python學習之模組Python
- Python學習——xml模組PythonXML
- Python time模組學習Python
- python模組學習:CookiePythonCookie
- Python模組學習:atexitPython
- Python模組學習:fileinputPython
- python常用模組補充hashlib configparser logging,subprocess模組Python
- Python學習——hashlib模組Python
- Python學習之常用模組Python
- Python學習——shelve模組Python
- python 各種模組學習Python
- python學習之argparse模組Python
- python optparse模組學習薦Python
- Python模組學習:urllibPython
- Python模組學習:datetimePython
- 【python】python 模組學習之--FabricPython
- 【python】python 模組學習之--pexpectPython
- Python3 中 configparser 模組解析配置的用法詳解Python
- Python學習之 datetime模組Python
- Python學習之模組與包Python
- python基礎學習16—-模組Python
- 學習Python的urllib模組Python
- python模組學習:anydbm, shelvePython
- Python的configparser模組讀取.ini檔案內容並輸出Python
- Python的shutil zipfile tarfile模組學習Python
- Python學習——logging模組Python
- Python模組學習:hashlib hash加密Python加密
- Python模組學習:copy 物件拷貝Python物件
- Python模組學習:subprocess 建立子程式Python
- Python學習之如何引用Python自定義模組?Python
- Python學習【第十四篇】shutil模組Python
- python學習第五天-模組Python
- Python模組學習:zipfile zip檔案操作Python