在我们写一个功能性的python脚本时,有时需要读取一个配置文件,这个配置文件可以给用户自定义修改,以实现程序的最大灵活性,谈到配置文件的修改,这对我们运维人员来说都应该不陌生,不管你维护的是web站点还是游戏项目或其它,运维的工作估计很大部分是内容就是通过修改配置文件来完成的,如果任何修改都要改代码去编译,那估计也没什么可运维性的了,当然回到运维的工作,我们日常写的维护脚本一般涉及不到特别复杂的配置文件读取,但这种读取配置的方式我认为是必须要学会的,所以今天我们就来学习下如何用 python实现读取配置文件,python要读取配置文件这里要用到ConfigParser模块,我们先来看看它的基础用法:
常用方法:
read(filename):读取一个配置文件
sections():获取配置文件中的section
options(section):获取该section的所有option
items(section) :获取该section的所有键值对
get(section,option) :获取section中option的值
以上有的不太理解不要紧,通过例子就很直观明白了,假如我这里已经有一个配置文件cfg.ini,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[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交换命令行,输入命令如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
>>> 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')] |
对照配置文件内容,再看下运行结果就很容易理解上面的方法都会返回什么结果,这个模块常用的操作就介绍到这里,往下我给一个实际生产环境中的例子,说到底还是要会用,没有实际代码的理论介绍是苍白的,因为我们每天面对的需求不仅要知,更重要的是要会做,以下这个脚本是之前写的了,今天翻出来做个学习参考,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
#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读取配置文件的介绍就到这里,如果有问题欢迎给我留言。