python配置檔案操作
在我們寫一個功能性的python指令碼時,有時需要讀取一個配置檔案,這個配置檔案可以給使用者自定義修改,以實現指令碼的最大靈活性,談到配置檔案的修改,這對我們運維人員來說應該都不陌生,因為運維的工作估計很大部分是內容就是通過修改配置檔案來完成的,如果產品的任意改動變化都要修改改程式碼,可想而知那樣效率會多麼低下,例如遊戲中開個1.5倍經驗,不好意思回去改程式碼再發布,折騰幾回都得崩潰,那回到我們的運維工作,我們日常寫的維護指令碼一般涉及不到特別複雜的配置檔案讀取,但這種讀取配置的方式我認為是必須要學會的,所以今天我們就來學習下如何用 python實現讀取配置檔案,python要讀取配置檔案這裡要用到ConfigParser模組,我們先來看看它的基礎用法:
常用方法:
read(filename):讀取一個配置檔案
sections():獲取配置檔案中的section
options(section):獲取該section的所有option
items(section) :獲取該section的所有鍵值對
get(section,option) :獲取section中option的值
以上方法使用不太理解沒關係,通過例子就很直觀明白了,假如我這裡已經有一個配置檔案cfg.ini,內容如下:
[server]
address = 192.168.1.1
port = 2280
[user]
user = cat
password = Test
[upload]
back_target = e:\\webadmin\\web\\flaskr
[winrar_path]
rar_path = C:\\”Program Files”\\WinRAR\\
現在我們開啟python互動命令列,輸入命令如下:
>>> import ConfigParser
>>> cf=ConfigParser.ConfigParser()
>>> cf.read(‘cfg.ini’)
[‘cfg.ini’]
>>> cf.sections()
[‘server’, ‘user’, ‘upload’, ‘winrar_path’]
>>> cf.options(‘server’)
[‘address’, ‘port’]
>>> cf.get(‘server’,’address’)
‘192.168.1.1’
>>> cf.items(‘server’)
[(‘address’, ‘192.168.1.1’), (‘port’, ‘2280’)]
對照配置檔案內容,再看下執行結果就很容易理解上面的方法都會返回什麼結果,這個模組常用的操作就介紹到這裡,往下我給一個實際生產環境中的例子,因為運維是個操作性很強的工作,知識說到底還是要會用,沒有實際程式碼的功能介紹是蒼白的,因為我們每天面對的需求不僅要知,更重要的是要會做,以下這個指令碼是之前寫的了,今天翻出來給大家做個學習參考,程式碼如下:
#encoding=utf-8
import os.path
import ConfigParser
from ftplib import FTP_TLS
from threading import Thread
import socket
import ssl
cf = ConfigParser.ConfigParser()
cf.read(r’e:\project1\ftplist.txt’)
user = ‘check_lg’
password = ‘test’
server_info = []
#定義FTP_TLS類
class IMPLICIT_FTP_TLS(FTP_TLS):
def __init__(self, host=”, user=”, passwd=”, acct=”, keyfile=None,
certfile=None, timeout=60):
FTP_TLS.__init__(self, host, user, passwd, acct, keyfile, certfile, timeout)
def connect(self, host=”, port=0, timeout=-1):
if host != ”:
self.host = host
if port > 0:
self.port = port
if timeout != -1:
self.timeout = timeout
try:
self.sock = socket.create_connection((self.host, self.port), self.timeout)
#self.af = self.sock.family
self.sock = ssl.wrap_socket(self.sock, self.keyfile, self.certfile)
self.file = self.sock.makefile(‘rb’)
self.welcome = self.file.readline()
except Exception as e:
print e
return self.welcome
#獲得配置檔案資訊,轉換成列表
def get_ip_port():
for arg in cf.sections():
ip, port = cf.options(arg)
ip = cf.get(arg, ip)
port = cf.get(arg, port)
info = (ip, port)
server_info.append(info)
return server_info
#檢查函式,測試是否ftp登入ok
def check_login(ftp_server, ftp_port):
try:
ftps = IMPLICIT_FTP_TLS()
#print help(ftps)
ftps.connect(host=ftp_server, port=ftp_port)
ftps.login(user=user, passwd=password)
ftps.quit()
return 1
except:
return 0
#根據檢查的成功或失敗,寫入檔案
def write_status(ftp_server, ftp_port):
result = check_login(ftp_server, ftp_port)
f = open(r’e:\project1\status.txt’, ‘a+’)
if result == 1:
f.write(ftp_server + ‘ login ok’ + ‘\n’)
else:
f.write(ftp_server + ‘ login error’ + ‘\n’)
f.close()
#主函式,判斷檔案大小是否為0,非0重置檔案,保持檔案內容最新,多執行緒檢查。
if __name__ == ‘__main__’:
threads = []
server_info = get_ip_port()
if os.path.getsize(r’e:\project1\status.txt’):
f = open(r’e:\project1\status.txt’, ‘r+’)
f.truncate()
f.close()
for i in range(0, len(cf.sections())):
ip, port = server_info[i]
threads.append(Thread(target=write_status, args=(ip, port)))
for thread in threads:
thread.start()
for thread in threads:
thread.join()
指令碼之前文章解釋過,今天就不多解釋了,其實大家看註釋也能明白,另外請注意這個指令碼是執行在windows系統下的,今天關於python讀取配置檔案的介紹就到這裡,這個模組不但可以讀取配置檔案,還可以修改、儲存配置檔案,所以想深入學習的可以去官網看資料。
文章出處:python運維技術