文件差异对比方法
#pip加速命令如下:
pip3 install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com packagename # packagename是要下载的包的名字
pip3 install -i http://e.pypi.python.org --trusted-host e.pypi.python.org --upgrade pip # 升级pip
difflib模块(自带)
示例一:两个字符串的差异对比
# coding: utf-8
import difflib
text1 = '''text1:'''
text1 = '''text1:
222
2222
22222
add string
'''
text2 = '''text2:
222
2222
22222
'''
text1Lines = text1.splitlines()
text2Lines = text2.splitlines()
d = difflib.Differ()
diff = d.compare(text1Lines,text2Lines)
print('\n'.join(list(diff)))
符号含义说明:
‘-’ 包含在第一个序列行,不在二
‘+’ 包含在第二个序列行,不在一
‘’ 两个序列行一致
‘?’ 标志两个序列行存在增量差异
'^' 标志出两个序列行存在的差异字符
生成美观的HTML格式文档
text1Lines = text1.splitlines()
text2Lines = text2.splitlines()
#d = difflib.Differ()
#diff = d.compare(text1Lines,text2Lines)
#print('\n'.join(list(diff)))
d = difflib.HtmlDiff()
print(d.make_file(text1Lines,text2Lines))
事例二:对比nginx文件差异
# coding: utf-8
import difflib
import sys
try:
textFile1='nginx01.txt'
textFile2='nginx02.txt'
except Exception as e:
print('Error:'+str(e))
sys.exit()
def readfile(filename):
try:
fileHandle = open(filename)
text=fileHandle.read().splitlines()
fileHandle.close()
return text
except IOError as error:
print('Read file error:'+str(error))
sys.exit()
if textFile1=='' or textFile2=='':
print('file is enpty.')
sys.exit()
text1Lines=readfile(textFile1)
text2Lines=readfile(textFile2)
d = difflib.HtmlDiff()
print(d.make_file(text1Lines,text2Lines))
文件与目录差异对比方法
filecmp模块(自带)可以实现文件、目录、遍历子目录的差异对比功能。
模块常用方法说明:
cmp单文件对比:
filecmp.cmp(f1,f2[,shallow])shallow==True,只根据os.sstat()方法返回的文件基本信息进行对比,比如最后的访问时间、修改时间、状态改变时间等,会忽略文件内容的对比。当shallow为False时,则os.stat()与文件内容同时进行校验。
filecmp.cmp('f1','f3')
True
filecmp.cmp('f1','f2')
False
cmpfiles多文件对比:
filecmp.cmpfiles(dir1,dir2,common[,shallow])方法,对比dir1和dir2目录给定的文件清单。该方法返回文件名的三个列表(匹配,不匹配,错误),错误列表包括了目录不存在文件、不具备读权限或其他原因导致的不能比较的文件清单。
md5sum *
#返回当前目录的MD5值
filecmp.cmpfiles('dir1','dir2',['f1','f2','f3','f4','f5'])
dircmp目录对比:
dircmp(a,b[,ignore[,hide]])类创建一个目录比较对象,其中a和b是参加比较的目录名。
ignore代表文件名忽略的列表,并默认为[‘RCS’,‘CVS’,‘tags’];
hide代表隐藏的列表,默认为[os.curdir,os.pardir]。
dircmp提供了三个输出报告的方法:
- report(),比较当前指定目录中的内容。
- report_partial_closure(),比较当前指定目录及第一级子目录中的内容。
- report_full_closure(),递归比较所有指定目录的内容。
dircmp类还提供了以下属性:
- left,左边目录
- right,右边目录
- left_list,左边目录中的文件及目录列表
- right_list,右边目录中的文件及目录列表
- common,两边目录共有的文件及目录列表
- left_only只在左边目录中的文件或目录
- right_only只在右边目录中的文件或目录
- common_dirs两边目录都存在的子目录
- common_files两边目录都存在的子文件
- common_funny两边目录都存在的子目录(不同目录类型或os.stat()记录的错误)
- same_files,匹配相同的文件
- diff_files,不匹配的文件
- funny_files,两边目录中都存在,但无法比较的文件
- subdirs,将common_dirs目录名映射到新的dircmp对象,格式为字典类型。
import filecmp
a='/home/test/filecmp/dir1'
b='/home/test/filecmp/dir2'
dirObj=filecmp.dircmp(a,b,['test.py'])
dirObj.report()
dirObj.report_partial_closure()
dirObj.report_full_closure()
print str(dirObj.left_list)
print str(dirObj.right_list)
print str(dirObj.common)
print str(dirObj.left_only)
print str(dirObj.right_only)
print str(dirObj.common_dirs)
print str(dirObj.common_files)
print str(dirObj.common_funny)
print str(dirObj.same_files)
print str(dirObj.diff_files)
print str(dirObj.funny_files)
实践:校验源与备份目录差异
# coding: utf-8
import os,sys
import filecmp,re,shutil
holderlist=[]
def compareme(dir1,dir2):
dircomp=filecmp.dircmp(dir1,dir2)
only_in_one=dircomp.left_only
diff_in_one=dircomp.diff_files
dirpath=os.path.abspath(dir1)
[holderlist.append(os.path.abspath(os.path.join(dir1,x))) for x in only_in_one]
[holderlist.append(os.path.abspath(os.path.join(dir1,x))) for x in diff_in_one]
if len(dircomp.common_dirs) > 0:
for item in dircomp.common_dirs:
compareme(os.path.abspath(os.path.join(dir1,item)),\
os.path.abspath(os.path.join(dir2,item)))
return holderlist
def main():
dir1='/home/datebase/dir1'
dir2='/home/datebase/dir2'
source_files=compareme(dir1,dir2)
dir1 = os.path.abspath(dir1)
if not dir2.endswith('/'):dir2=dir2+'/'
dir2=os.path.abspath(dir2)
destination_files=[]
createdir_bool=False
for item in source_files:
destination_dir=re.sub(dir1,dir2,item)
destination_files.append(destination_dir)
if os.path.isdir(item):
if not os.path.exists(destination_dir):
os.makedirs(destination_dir)
createdir_bool=True
if createdir_bool:
destination_files=[]
source_files=[]
source_files=compareme(dir1,dir2)
for item in source_files:
destination_dir=re.sub(dir1,dir2,item)
destination_files.append(destination_dir)
print('update item:')
print(source_files)
copy_pair=zip(source_files,destination_files)
for item in copy_paair:
if os.path.isfile(item[0]):
shutil.copyfile(item[0],item[1])
if __name__=='__main__':
main()
发送电子邮件模块smtplib
# coding: utf-8
import smtplib
import string
HOST = 'smtp.163.com'
SUBJECT = 'Test email from Python'
TO = "111@qq.com"
FROM = '222@163.com'
text = 'Python rules them all!'
BODY = '\r\n'.join("From: %s\nTo: %s \nSubject: %s \n%s"%(FROM,TO,SUBJECT,text))
server = smtplib.SMTP()
server.connect(HOST,'25')
server.starttls()
mypasswd=open('temp.txt').read()
server.login(FROM,mypasswd)
server.sendmail(FROM,[TO],BODY)#失败554错误
server.quit()
事例一:定制个性化的有间隔是方法
- email.mime.audio.MIMEAudio(_audiodata[,_subtype[,**_params]]]),创建包含音频数据的邮件体,_audiodata包含原始二进制音频数据的字节字符串。
- email.mime.image.MIMEImage(_imagedata[,_subtype[,_encoder[,**_params]]]),创建包含图片数据的邮件体,_imagedata是包含原始图片数据的字节字符串。
- email.mime.text.MIMEText(_text[,subtype[,charset]]),创建包含文本数据的邮件体,_text是包含信息负载的字符串,_subtype指定文本类型,支持plain(默认值)或html类型的字符串。
# coding: utf-8
import smtplib
from email.mime.text import MIMEText
HOST='smtp.163.com'
SUBJECT = u'IS a table'
TO = 'xx1@qq.com'
FROM='xx2@163.com'
htmlfile = open('sendmail.html').read()
msg = MIMEText(htmlfile,"html","utf-8")
msg['Subject'] = SUBJECT
msg['From'] = FROM
msg['To'] = TO
passwd = open('temp.txt').read()
try:
server = smtplib.SMTP()
server.connect(HOST,'25')
server.starttls()
server.login(FROM,passwd)
server.sendmail(FROM,TO,msg.as_string())
server.quit()
print('sussful')
except Exception as e:
print('false')
#sendmail.html
<table width="800" border="0" cellspacing="0" cellpadding="4">
<tr><td bgcolor="#CECFAD" height="20" style="font-size: 14px">官网数据</td><a href="monitor.domain.com">更多>></a>
</tr>
<tr>
<td bgcolor="#EFEBDB" height="100" style="font-size: 13px">
1)日访问量:<font color="red">152433</font>访问次数:23651<br>
2)状态码信息<br>
500:105<br>
3)访问浏览器信息<br>
IE:50%<br>
4)页面信息<br>
/index.php 42444<br>
/view.php 23233<br>
/login.php 2332<br>
</td>
</tr>
</table>
示例二:实现图文格式的服务器性能报表邮件。
#在img文件夹下方4张图片
# coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
HOST='smtp.163.com'
SUBJECT='Data report'
TO = '1772040722@qq.com'
FROM = 'become_hero1198@163.com'
passwd = open('passwd.txt').read()
htmlObj = open('simple3.html')
def addimg(src,imgid):
fp = open(src,'rb')
msgImage = MIMEImage(fp.read())
fp.close()
msgImage.add_header('Content-ID',imgid)
return msgImage
msg = MIMEMultipart('related')
msgtext = MIMEText(htmlObj.read(),"html","utf-8")
msg.attach(msgtext)
msg.attach(addimg('img/test1.jpg','io'))
msg.attach(addimg('img/test2.jpg','men'))
msg.attach(addimg('img/test3.jpg','swap'))
msg.attach(addimg('img/test4.jpg','key_hit'))
msg['Subject'] = SUBJECT
msg['From'] = FROM
msg['To']=TO
try:
server = smtplib.SMTP()
server.connect(HOST,'25')
server.starttls()
server.login(FROM,passwd)
server.sendmail(FROM,TO,msg.as_string())
server.quit()
print('sussesful')
except Exception as e:
print('Falsed'+str(e))
示例二:实现图文格式的服务器性能报表邮件。
#增加附件
# coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
HOST = 'smtp.163.com'
SUBJECT = 'This is my report'
TO = '1772040722@qq.com'
FROM = 'become_hero1198@163.com'
def addimg(src,imgid):
fp = open(src,'rb')
msgImage = MIMEImage(fp.read())
msgImage.add_header('Content-ID',imgid)
return msgImage
msg = MIMEMultipart('related')
htmlObj = open('simple4.html','rb').read()
msgtext = MIMEText(htmlObj,"html","utf-8")
msg.attach(msgtext)
msg.attach(addimg('img/test1.jpg','weekly'))
attach = MIMEText(open('simple4.xlsx','rb').read(),'base64','utf-8')
attach["Content-Type"] = 'application/octet-stream'
#attach['Content-Disposition'] = "attachment;filename=\"myReport.xlsx\"".decode("utf-8").encode("gb18030")
msg.attach(attach)
msg['Subject'] = SUBJECT
msg['From'] = FROM
msg['To'] = TO
passwd = open('passwd.txt').read()
try:
server = smtplib.SMTP()
server.connect(HOST,'25')
server.starttls()
server.login(FROM,passwd)
server.sendmail(FROM,TO,msg.as_string())
server.quit()
print('sussesful')
except Exception as e:
print('Falsed'+str(e))
探测web服务质量方法
问题一:安装报错
centos 安装pycurl
yum install python-devel curl-devel
pip3 install pycurl
问题二:导入pycurl报错问题:import pycurl
(1)源码安装curl(2)源码安装pycurl
wget http://curl.haxx.se/download/curl-7.63.0.tar.gz
tar -xvf curl-7.63.0.tar.gz#解压
cd curl.7.63.0#指定安装目录
./configure
make&&make install#编译安装
export LD_LIBRARY_PATH=/usr/local/bin#添加命令的环境变量
#在pypi上搜索pycurl,找到tar包
wget tar包路径 --no-check-certificate
cd pycurl-7.19.3.1
python3 setup.py install --curl-config=/usr/local/bin/curl-config
模块常用方法说明
- close()关闭Curl对象。
- perform()实现Curl对象请求的提交。
- setopt(option,value)对应libcurl包中的curl_easy_setopt方法,参数option通过libcurl的常量来指定的,参数的值会依赖option。常用的常量列表:
pycurl.Curl() #创建一个curl对象
c.setopt(pycurl.CONNECTTIMEOUT,5) #连接的等待时间,设置为0则不等待
c.setopt(pycurl.TIMEOUT,5) #请求超时时间
c.setopt(pycurl.NOPROGRESS,0) #是否屏蔽下载进度条,非0则屏蔽
c.setopt(pycurl.MAXREDIRS,5) #指定HTTP重定向的最大数
c.setopt(pycurl.FORBID_REUSE,1) #完成交互后强制断开连接,不重用
c.setopt(pycurl.FRESH_CONNECT,1) #强制获取新的连接,即替代缓存中的连接
c.setopt(pycurl.DNS_CACHE_TIMEOUT,60) #设置保存DNS信息的时间,默认为120秒
c.setopt(pycurl.URL,"http://www.baidu.com") #指定请求的URL
c.setopt(pycurl.USERAGENT,"Mozilla/5.2(compatible;MSIE6.0;WindowsNT5.1;SV1;.NETCLR1.1.4322;.NETCLR2.0.50324)")#配置请求HTTP头的User-Agent
c.setopt(pycurl.HEADERFUNCTION,getheader) #将返回的HTTPHEADER定向到回调函数getheader
c.setopt(pycurl.WRITEFUNCTION,getbody) #将返回的内容定向到回调函数getbody
c.setopt(pycurl.WRITEHEADER,fileobj) #将返回的HTTPHEADER定向到fileobj文件对象
c.setopt(pycurl.WRITEDATA,fileobj) #将返回的HTML内容定向到fileobj文件对象
- getinfo(option)
常用的常量列表:
c=pycurl.Curl() #创建一个curl对象
c.getinfo(pycurl.HTTP_CODE) #返回的HTTP状态码
c.getinfo(pycurl.TOTAL_TIME) #传输结束所消耗的总时间
c.getinfo(pycurl.NAMELOOKUP_TIME) #DNS解析所消耗的时间
c.getinfo(pycurl.CONNECT_TIME) #建立连接所消耗的时间
c.getinfo(pycurl.PRETRANSFER_TIME) #从建立连接到准备传输所消耗的时间
c.getinfo(pycurl.STARTTRANSFER_TIME) #从建立连接到传输开始消耗的时间
c.getinfo(pycurl.REDIRECT_TIME) #重定向所消耗的时间
c.getinfo(pycurl.SIZE_UPLOAD) #上传数据包大小
c.getinfo(pycurl.SIZE_DOWNLOAD) #下载数据包大小
c.getinfo(pycurl.SPEED_DOWNLOAD) #平均下载速度
c.getinfo(pycurl.SPEED_UPLOAD) #平均上传速度
c.getinfo(pycurl.HEADER_SIZE) #HTTP头部大小
我们利用这些常量来达到探测web服务服务质量的目的。
实践:实现探测web服务质量
# coding: utf-8
import os,sys,time,pycurl
URL='http://www.baidu.com'
c=pycurl.Curl()
c.setopt(pycurl.URL,URL)
c.setopt(pycurl.CONNECTTIMEOUT,5)
c.setopt(pycurl.TIMEOUT,5)
c.setopt(pycurl.NOPROGRESS,1)
c.setopt(pycurl.FORBID_REUSE,1)
c.setopt(pycurl.MAXREDIRS,1)
c.setopt(pycurl.DNS_CACHE_TIMEOUT,30)
indexfile = open('content.txt','wb')
c.setopt(pycurl.WRITEHEADER,indexfile)
c.setopt(pycurl.WRITEDATA,indexfile)
try:
c.perform()
except Exception as e:
print('connection error:'+str(e))
indexfile.close()
c.close()
sys.exit()
print('namelookup_time:%s'%(c.getinfo(c.NAMELOOKUP_TIME)))
print('connect_time:%s'%(c.getinfo(c.CONNECT_TIME)))
print(c.getinfo(c.PRETRANSFER_TIME))
print(c.getinfo(c.STARTTRANSFER_TIME))
print(c.getinfo(c.TOTAL_TIME))
print(c.getinfo(c.HTTP_CODE))
print(c.getinfo(c.SIZE_DOWNLOAD))
print(c.getinfo(c.HEADER_SIZE))
print(c.getinfo(c.SPEED_DOWNLOAD))
indexfile.close()
c.close()