在我們寫一個功能性的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讀取配置文件的介紹就到這裡,這個模塊不但可以讀取配置文件,還可以修改、保存配置文件,所以想深入學習的可以去官網看資料。