文件内容差异对比方法

使用diffie模块实现文件内容差异对比。dmib作为 Python的标准库模块,
无需安装,作用是对比文本之间的差异,且支持输出可读性比较强的HTML文档,与 Linux
下的dif命令相似。我们可以使用 diffie对比代码、配置文件的差别,在版本控制方面是非
常有用。 Python3.x或更高版本默认自带 diffie模块,无需额外安装。

  • 实例:两个字符串的差异对比
  • 生成美观的对比HTML格式文档
  • 对比Nginx配置文件的差异

两个字符串的差异对比

本例通过使用difflib模块实现两个字符串的差异对比,然后以版本控制风格进行输出。

>>> import difflib
>>>
>>> text1="difflib document v7.4" #定义字符串1
>>> text2="difflib document v7.5" #定义字符串2
>>>
>>> text1_lines=text1.splitlines() #进行分割,以便于进行对比
>>> text2_lines=text2.splitlines()
>>>
>>> diff=difflib.Differ() #创建Differ()对象
>>>
>>> differ=diff.compare(text1_lines,text2_lines) #采用compare方法对比字符串
>>>
>>> print('\n'.join(list(differ)))
- difflib document v7.4
? ^ + difflib document v7.5
? ^ >>> //注释:对符号含义说明
// - #包含在第一个序列行中,但不包含在第二个序列行中
// + #包含在第二个序列行中,但不包含在第一个序列行中
// 空 #两个序列行一致
// ? #两个序列行存在增量差异
// ^ #两个序列行存在差异字符

生成美观的对比HTML格式文档

采用HtmlDiff()类的make_file()方法就可以生成美观的HTML文档啦。

>>> import difflib
>>>
>>> text1_lines=text1.splitlines()
>>> text2_lines=text2.splitlines()
>>>
>>>
>>> text1_lines=text1.splitlines()
>>> text2_lines=text2.splitlines()
>>>
>>> diff=difflib.HtmlDiff()
>>> print(diff.make_file(text1_lines,text2_lines))

对比Nginx配置文件的差异

import difflib
import sys try:
textfile1 = sys.argv[1] #第一个文件参数
textfile2 = sys.argv[2] #第二个文件参数
except Exception (e):
print ("Error:" +str(e))
print ("Usage: python sample3.py filename1 filename2")
sys.exit() def readfile(filename): #文件读取分隔函数
try:
filehandle = open(filename,'rb')
text = filehandle.read().splitlines() #读取后进行分分隔
filehandle.close()
return text
except IOError as error:
print ('Read file Error:' +str(error))
sys.exit() text1_lines = readfile(textfile1) #调用readline函数,获取分隔后的字符串
text2_lines = readfile(textfile2) d = difflib.HtmlDiff() #创建htmldiff()对象
print (d.make_file(str(text1_lines),str(text2_lines))) #通过make_file方法输出HTML格式的比对结果 //注释:调用格式 python *.py nginx.conf nginx1.conf > index.html

文件与目录差异对比方法

当我们进行代码审计或校验备份结果时,往往需要检査原始与目标目录的文件一致性,
Python的标准库已经自带了满足此需求的模块 filecmp。 filecmp可以实现文件、目录、遍历
子目录的差异对比功能。比如报告中输出目标目录比原始多出的文件或子目录,即使文件同
名也会判断是否为同一个文件(内容级对比)等, Python3.x或更高版本默认自带 filecmp模
块,无需额外安装,下面进行详细介绍。

目录:

  • 模块常用方法说明
  • 实例:校验源备份目录的差异

模块常用方法说明

filecmp提供了三个操作方法,分别是cmd(单文件对比),cmpfiles(多文件对比),dircmp(目录对比)

#比较单文件的差异

>>> import filecmp
>>>
>>> filecmp.cmp("/root/passwd","/root/passwd1") #false表示两文件存在差异
False
>>>
>>> filecmp.cmp("/root/passwd","/root/passwd") #true表示两文件不存在差异
True
>>>

#dir1与dir2目录中指定文件清单对比(多文件对比)

首先查看两个目录下文件的md5信息

[root@localhost ~]# md5sum /root/dir1/*
2dd2ba1e74c9550bc296f1897d0d28ea /root/dir1/f1
17fe7001eacbe989f30800e6d388468e /root/dir1/f2
34ba72536687abe2af89b3c08f057508 /root/dir1/f3
fa2529c29d2185a6794f9510deeb648d /root/dir1/f4
[root@localhost ~]#
[root@localhost ~]# md5sum /root/dir2/*
d82149e67b8a46e475f399c9f972b3e1 /root/dir2/f1
4072f32423778ba29fbcde9e10162964 /root/dir2/f2
134839dbce78e8d11273c5b105eb7172 /root/dir2/f3
fa2529c29d2185a6794f9510deeb648d /root/dir2/f4
[root@localhost ~]#

使用cmpfiles对比结果如下

>>> import filecmp
>>>
>>> filecmp.cmpfiles("/root/dir1","/root/dir2",["f1","f2","f3","f4"])
(['f4'], ['f1', 'f2', 'f3'], [])

#通过调用dircmp()方法实现目录差异对比功能,同时输出目录对比对象所有属性信息

import filecmp

dir1="/root/dir1"                               #定义左目录
dir2="/root/dir2" #定义右目录 diff=filecmp.dircmp(dir1,dir2,["test.py"]) #目录比较,忽略test.py文件 diff.report() #比较当前指定目录中的内容
diff.report_partial_closure() #比较当前指定目录及第一级子目录中的内容
diff.report_full_closure() #递归比较所有目录 #------------------------------------------------------------------------ print(str(diff.left_list)) #左目录中的文件及目录列表
print(str(diff.right_list)) #右目录中的文件及目录列表
print(str(diff.common)) #两边目录共同存在的文件或目录
print(str(diff.left_only)) #只在左目录中的文件或目录
print(str(diff.right_only)) #只在右目录中的文件或目录
print(str(diff.common_dirs)) #两边目录都存在的子目录
print(str(diff.common_files)) #两边目录都存在的子文件
print(str(diff.common_funny)) #两边目录都存在的子目录
print(str(diff.same_files)) #匹配相同的文件
print(str(diff.diff_files)) #不匹配的文件
print(str(diff.funny_files)) #两边目录中都存在,但无法比较的文件

发送电子邮件模块SMTPlib

电子邮件是最流行的互联网应用之一。在系统管理领域,我们常常使用邮件来发送告警
信息、业务质量报表等,方便运维人员第一时间了解业务的服务状态。本节通过 Python的
smtplib模块来实现邮件的发送功能,模拟一个smtp客户端,通过与smtp服务器交互来实
现邮件发送的功能,这可以理解成 Foxmail的发邮件功能,在第一次使用之前我们需要配置
smtp主机地址、邮箱账号及密码等信息, Python3.x或更高版本默认自带 smtplib模块,无需
额外安装。下面详细进行介绍。

目录:

  • smtplib模块的常用类与方法
  • 定制个性化的邮件格式方法
  • 定制常用邮件格式示例详解

SMTPlib模块的常用类与方法

不知为何就是无法发送邮件

import smtplib
import string HOST="smtp.gmail.com" #定义SMTP主机
SUBJECT="Test Email From Python" #定义邮件主题
TO="1181506874@qq.com" #定义邮件收件人
FROM="mymail@gmail.com" #定义邮件发件人
text="Hello Python!" #邮件内容 BODY="\r\n".join(( #组转sendmail方法的邮件主题内容,字段以"\r\n"分隔
"From: %s" % FROM,
"To: %s" % TO,
"Subject: %s" % SUBJECT,
"",
text
)) server=smtplib.SMTP() #创建一个SMTP()对象
server.connect(HOST,"") #通过connect方法链接SMTP主机
server.starttls() #启用安全模式
server.login("mymail@gmail.com","") #邮件账号密码登陆验证
server.sendmail(FROM,[TO],BODY) #邮件发送
server.quit() #断开SMTP链接

《Python自动化运维之路》 业务服务监控(二)的更多相关文章

  1. python自动化运维之路~DAY5

    python自动化运维之路~DAY5 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.模块的分类 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数 ...

  2. Python自动化运维之路-01

    python的主要应用 python的擅长领域 学python有没有前途?python的语言排名 语言选择 运维会了开发后可以干什么? python的最大优势就是什么都能做. 课程概述 毕业目标 周五 ...

  3. 【Python自动化运维之路Day9】Socket

    socket也可以认为是套接字是一种源IP地址和目的IP地址以及源端口号和目的端口号的组合.网络化的应用程序在开始任何通讯之前都必须要创建套接字.就像电话的插口一样,没有它就没办法通讯. socket ...

  4. 《Python自动化运维之路》 系统基础信息模块(一)

    系统性能收集模块Psutil 目录: 系统性能信息模块psutil 系统性能信息模块psutil psutil能够轻松实现获取系统运行的进程和系统利用率包括(CPU,内存,磁盘 和网络)等.主要用于系 ...

  5. python自动化运维之路06

    python中面向对象编程 编程范式: 编程是 程序 员 用特定的语法+数据结构+算法组成的代码来告诉计算机如何执行任务的过程 , 一个程序是程序员为了得到一个任务结果而编写的一组指令的集合,正所谓条 ...

  6. 【Python自动化运维之路Day7】

    1. configparser模块 import configparser config = configparser.ConfigParser() #先把config应用一下configparser ...

  7. 【Python自动化运维之路Day6】

    1.递归思考题,阶乘 使用递归方式(函数)计算: 1*2*3*4*5*6*7*8*9*10的值 def func(num): if num==1: return 1 return num*func(n ...

  8. 【Python自动化运维之路Day4】

    abs()  取绝对值all()  所有为真,则为真,否则为假any()  至少有一个为真,就为真,否则为假callable()   判断函数是否可以被调用,如果可以返回True,否则返回False ...

  9. 【Python自动化运维之路Day2】

    1. 常量命名规则 在Python中,会在变量命名上标明某变量是常量,通常采用全是大写的方式来标明,如: CONNECT= '127.0.0.1' PORT = ' 2.Python编译 python ...

随机推荐

  1. 【转】先说IEnumerable,我们每天用的foreach你真的懂它吗?

    [转]先说IEnumerable,我们每天用的foreach你真的懂它吗? 我们先思考几个问题: 为什么在foreach中不能修改item的值? 要实现foreach需要满足什么条件? 为什么Linq ...

  2. 2016-2017-2 20155312 实验二《Java面向对象程序设计》实验报告

    知识总结 伪代码 产品代码 Java编程时,程序员对类实现的测试叫单元测试. 测试用例是为某个特殊目标而编制的一组测试输入.执行条件以及预期结果,以便测试某个程序路径或核实是否满足某个特定需求. 先写 ...

  3. mysql安装后初始密码

    在安装过程中没有任何提示,安装完之后无法登陆 后经查询发现,可以暂时以 mysql -u root -p登陆 此账户没有密码直接enter即可. update user set Password=PA ...

  4. 2019.01.20 bzoj5158 Alice&Bob(拓扑排序+贪心)

    传送门 短代码简单题. 题意简述:对于一个序列XXX,定义其两个伴随序列a,ba,ba,b,aia_iai​表示以第iii个数结尾的最长上升子序列长度,bib_ibi​表示以第iii个数开头的最长下降 ...

  5. C[a,b]向量空间中的函数的线性相关性

  6. jquery特殊字符转义方法

    //特殊字符转义function escapeJquery(srcString) { // 转义之后的结果 var escapseResult = srcString; // javascript正则 ...

  7. 使用bat批处理文件定时自动备份oracle数据库并上传ftp服务器

    一.使用bat批处理文件备份oracle(前提是配置好oracle数据库客户端) @echo off set databasename=orcl  //数据库名 set username=ninic ...

  8. kubeadm 双节点部署k8s v1.13.3+calico v3.3.4

    一.部署环境 VMware Workstation 10 centos7 二.主机配置(每台主机都要做) 主机名 ip cpu ram master 192.168.137.10 3G node1 1 ...

  9. dj 中间件

    中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局上改变django的输入与输出.因为改变的是全局,所以需要谨慎实用,用不好会影响到 ...

  10. UVa 11021 Tribles (概率DP + 组合数学)

    题意:有 k 只小鸟,每只都只能活一天,但是每只都可以生出一些新的小鸟,生出 i 个小鸟的概率是 Pi,问你 m 天所有的小鸟都死亡的概率是多少. 析:先考虑只有一只小鸟,dp[i] 表示 i 天全部 ...