写在前面,公众号的留言功能开通有一段时间了,如果需要交流请尽量选择留言的方式,因为平时我也要working,所以后台消息有时会无法及时回复,望理解,正文如下。
在我们写一个功能性的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读取配置文件的介绍就到这里,这个模块不但可以读取配置文件,还可以修改、保存配置文件,所以想深入学习的可以去官网看资料