Python學習——configparser模組

淺洛帆發表於2018-05-15

一、概述

在軟體開發過程中,很多時候需要處理配置檔案的讀取解析和改寫,在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']

持久化儲存時可指定儲存到原始檔進行覆蓋寫處理,也可以另存為其他檔案。

轉載自:http://www.cnblogs.com/linupython/p/8424985.html

相關文章