安裝軟件時(shí),,經(jīng)常會(huì)見到后綴為.cfg,、.ini的文件,,一般我們不用管,只要不刪就行,。因?yàn)檫@些是程序安裝,、運(yùn)行時(shí)需要用到的配置文件,。但對(duì)開發(fā)者來說,這種文件是怎么回事就必須搞清了,。本文從.cfg文件的創(chuàng)建,、編輯修改到使用等方面,進(jìn)行解讀,,幫助大家掌握配置文件,。
一,、配置文件的作用
配置文件的作用是保存一些在程序運(yùn)行時(shí)需用到的參數(shù),,在程序運(yùn)行過程中,通過代碼讀取配置文件獲得參數(shù),,保障程序的正常運(yùn)行,。如果誤刪了配置文件,代碼取不到數(shù)據(jù),,程序也就無法正常運(yùn)行了,。配置文件一般保存的參數(shù)有:
1)使用數(shù)據(jù)庫(kù)的程序,程序與數(shù)據(jù)庫(kù)的連接參數(shù),,常常被寫入配置文件讀取調(diào)用,;
2)有登錄賬號(hào)、密碼的程序,,登錄名及賬號(hào)信息一般也會(huì)寫入配置文件,。當(dāng)程序運(yùn)行到登錄界面時(shí),只需讀取配置文件,,就能對(duì)登錄信息進(jìn)行判斷,,而不必運(yùn)行到主程序,提高運(yùn)行效率,。
3)桌面程序界面設(shè)置信息等
這里需要注意的是,,不是所有的程序都必須有配置文件。因?yàn)榕渲梦募淖饔谜f白了也就是單獨(dú)存儲(chǔ)數(shù)據(jù),,如果項(xiàng)目很小,用到的數(shù)據(jù)很少,,就沒有弄配置文件的必要,, 直接把數(shù)據(jù)寫在代碼里就可以了。
二,、配置文件的后綴格式
很多人奇怪為什么配置文件的后綴格式.cfg是什么意思,而有時(shí).ini,、.xml,、.dat格式文件也叫配置文件?其實(shí),知道了配置文件的本質(zhì)和項(xiàng)目開發(fā)習(xí)慣就明白了,。首先,,配置文件的本質(zhì)就是文本文件,能直接用記事本打開,、編輯,。文件的后綴,可以是.txt,,也可以根據(jù)自己的意愿隨便修改,,比如改為.cfg,.ini等都是沒問題的,。
雖然配置文件的后綴可以根據(jù)自己的喜好隨意定,,但也不是任何時(shí)候想改就改的。因?yàn)榕渲梦募暮缶Y格式已經(jīng)寫入到程序代碼里了,,如果中途修改后綴,,而代碼里還是原后綴格式,就會(huì)造成找不到配置文件導(dǎo)致程序運(yùn)行不了的后果,。比如,,原配置文件為cg.cfg,一般代碼里會(huì)有這樣的讀取語(yǔ)句:
cp.read('source\cg.cfg')
如果將配置文件修改為cg.ini,,則須修改代碼語(yǔ)句為:
cp.read('source\cg.ini')
否則,,若還是cp.read('source\cg.cfg')語(yǔ)句,就找不到模配置文件,,報(bào)錯(cuò),。而我們安裝軟件時(shí),是不可能改代碼的,。所以,,面對(duì)安裝包里的配置文件,正確做法就是不管,,不刪不改不移動(dòng)就行,。
為提高代碼的通用性和可讀性,項(xiàng)目開發(fā)時(shí)會(huì)提前約定好固定的后綴作為配置文件的格式,,這就是項(xiàng)目開發(fā)習(xí)慣的結(jié)果,。所以現(xiàn)在一般只要看到.cfg、.ini等后綴的文件,,就知道這是配置文件,。若突然換了個(gè)個(gè)性的后綴,就容易讓人蒙圈,。
所以后綴.cfg沒有特殊的含義,,只是約定的習(xí)慣用法而已,,只不過不止約定了這一種,還約定了.ini,、.dat,、.xml等,所以.ini,、.xml,、.dat格式文件都叫配置文件。
三,、配置文件里內(nèi)容的格式
和文件后綴格式可以隨便自定義不同,,配置文件里內(nèi)容的格式要求很嚴(yán)格,內(nèi)容樣式為:
[section]
option = value
...
其中:section為節(jié)點(diǎn),,用中括號(hào)括起來,;option為鍵,value為鍵對(duì)應(yīng)的值,,option= value構(gòu)成鍵值對(duì),,一個(gè)鍵只對(duì)應(yīng)一個(gè)值,同一個(gè)section節(jié)點(diǎn)下option鍵不能重復(fù)出現(xiàn),。
如下圖,,節(jié)點(diǎn)(section)[rew]下出現(xiàn)了兩個(gè)相同的鍵(option)name:
運(yùn)行python讀取該文件代碼:cp.read('1.txt')時(shí),,會(huì)提示報(bào)錯(cuò):
configparser.DuplicateOptionError: While reading from '1.txt' [line 3]: option 'name' in section 'rew' already exists
意思是第3行的option'name'在節(jié)點(diǎn)section‘rew’里已存在,。
四、配置文件的創(chuàng)建,、寫入數(shù)據(jù)
了解了配置文件的本質(zhì)是文本文件,,且后綴可隨意更改的特點(diǎn)后,文件的創(chuàng)建和修改就簡(jiǎn)單了,。直接用記事本創(chuàng)建文件,,按內(nèi)容格式要求寫好數(shù)據(jù)后,將文件保存為后綴為.cfg或其他擬定的后綴格式文件即可,。也可以直接用代碼方法:用open('confg.cfg', 'w')函數(shù)可以在當(dāng)前文件夾下創(chuàng)建名為“confg.cfg”的文件,,'w'參數(shù)代表可以向文件寫入數(shù)據(jù),然后用write(f),,將文件保存下來,。如下面的代碼
from configparser import ConfigParser
cp = ConfigParser()
cp.add_section('test1')
cp.set('test1', 'name', '張三')
cp.set('test1', 'sn', '123456')
with open('confg.cfg', 'w') as f:
cp.write(f)
運(yùn)行后即生成的了保存有兩條信息的confg.cfg文件,右鍵用記事本打開查看,,結(jié)果為:
五,、配置文件的常用操作函數(shù)
上面我們創(chuàng)建并寫入了配置文件內(nèi)容,,有時(shí),,我們需要在程序運(yùn)行過程中,根據(jù)用戶交互信息,,自動(dòng)修改配置文件信息,,這就只能用代碼了。python的ConfigParser模塊下有多個(gè)操作配置文件的函數(shù),,常用的有10個(gè),,具體如下:
1、read(file.cfg):讀取配置文件
from configparser import ConfigParser
cp = ConfigParser()
cp.read('confg.cfg')
2,、set(section, name, value):新增項(xiàng)目(name:“李四”,,sn:‘123’),新增時(shí),,節(jié)點(diǎn)(section)下不能存在為‘李四’的項(xiàng)目鍵(name),,否則就變成了修改鍵對(duì)應(yīng)的值,如下面第3條,。
cp.set('test1', '李四', '123')
3,、set(section, name, value):將配置文件里的“李四”對(duì)應(yīng)sn修改為新sn“666”
cp.set('test1', '李四', '666') # 將原sn:123,該為新sn:666
4,、remove(section, name):刪除項(xiàng)目
cp.remove_section('test2') #如果文件里沒有test2節(jié)點(diǎn),,就無法刪除,會(huì)報(bào)錯(cuò),,所以一般要先判斷是否存在該節(jié)點(diǎn),。
5、has_section(section):判斷是否存在節(jié)點(diǎn)
cp.add_section('test2')
6,、add_section(section):增加節(jié)點(diǎn)
cp.add_section('test2')
注意:不能增加已經(jīng)存在的section,,為了避免出錯(cuò),可先判斷是否存在節(jié)點(diǎn)(section),。
7,、sections():得到所有的section,返回結(jié)果為列表
from configparser import ConfigParser
cp = ConfigParser()
cp.add_section('test1')
cp.set('test1', 'name', '張三')
cp.set('test1', 'sn', '123456')
cp.add_section('test2')
cp.set('test2', 'name', '張')
cp.set('test2', 'sn', '123')
with open('confg.cfg', 'w') as f:
cp.write(f)
cp.read('confg.cfg')
print(cp.sections())
運(yùn)行結(jié)果為:['test1', 'test2']
8,、options(section) :得到section下的所有option (key值),,返回結(jié)果為列表
from configparser import ConfigParser
cp = ConfigParser()
cp.read('confg.cfg')
print(cp.options('test1'))
運(yùn)行結(jié)果為:['name', 'sn']
9、items(section):得到section的所有鍵值對(duì)
from configparser import ConfigParser
cp = ConfigParser()
cp.read('confg.cfg')
print(cp.items('test1'))
運(yùn)行結(jié)果為:[('name', '張三'), ('sn', '123456')]
10,、get(section, option):得到section中option的值,,返回為string類型
from configparser import ConfigParser
cp = ConfigParser()
cp.read('confg.cfg')
print(cp.get('test1', 'name'))
運(yùn)行結(jié)果:張三
11、getint(section, option):得到section中的option值,,返回為int類型
from configparser import ConfigParser
cp = ConfigParser()
cp.read('confg.cfg')
print(cp.getint('test1', 'sn'),type(cp.getint('test1', 'sn')))
運(yùn)行結(jié)果:123456 <class 'int'>
6,、試用
了解了這些后,我們可以試著找一些軟件配置文件,,打開看數(shù)據(jù)都是些什么格式,。比如,,下圖是SQL SERVER安裝包里帶的一個(gè)配置文件的內(nèi)容,注意該配置文件后綴是.ini,,用記事本打開查看:
注意著里面的第一行是分號(hào)開頭的字符串,在我們正常的python3,環(huán)境下讀取時(shí)會(huì)報(bào)錯(cuò),,將分號(hào)改為python里的注釋符即可,。
異常錯(cuò)誤處理
用ConfigParser模塊的read函數(shù)讀取配置文件時(shí),偶爾會(huì)出現(xiàn)一種奇怪的錯(cuò)誤,,提示為
configparser.MissingSectionHeaderError:File contains no section headers,,
具體是將配置文件的第一行讀取為:'锘縖sql_connect]\n',而實(shí)際是'[sql_connect]',。
這種錯(cuò)誤很無語(yǔ),,很讓初次見到的人崩潰。其實(shí),,這種錯(cuò)誤是因?yàn)閣indows讀取配置文件時(shí),,額外追加了亂碼信息導(dǎo)致。如何消除亂碼,,有人用字符替換,,有人通過保存配置文件時(shí)修改編碼方式,逐一試過后,,都沒起作用,,看來不是特效藥。最后,,找到了一個(gè)最簡(jiǎn)單的辦法,,重建一個(gè)同名的文件,將配置文件里的內(nèi)容復(fù)制粘貼過去就好,。