• Python自动化:业务服务监控


    文件内容差异对比方法

    使用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('
    '.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="
    ".join((                              #组转sendmail方法的邮件主题内容,字段以"
    "分隔
                    "From: %s" % FROM,
                    "To: %s" % TO,
                    "Subject: %s" % SUBJECT,
                    "",
                    text
                    ))
    
    
    server=smtplib.SMTP()                           #创建一个SMTP()对象
    server.connect(HOST,"25")                       #通过connect方法链接SMTP主机
    server.starttls()                               #启用安全模式
    server.login("mymail@gmail.com","123123")       #邮件账号密码登陆验证
    server.sendmail(FROM,[TO],BODY)                 #邮件发送
    server.quit()                                   #断开SMTP链接
  • 相关阅读:
    Swoole实战之手撸HttpServer框架 16 关于服务的平滑重启与热加载与cli_set_process_title函数的使用、添加前置进程、修改代码服务器自动热更新
    Swoole实战之手撸HttpServer框架 17 里程碑 整合前置进程、热更新、Ioc容器
    axios取消请求
    echarts使用transform缩放后导致图标模糊
    vuex4的简单使用
    Vite 按需引入 Ant Design Vue 3.0
    TS声明promise返回来的数据类型
    JavaScript一种新的数据结构类型Map
    CF1453D Checkpoints(期望)
    PLOP: Learning without Forgetting for Continual Semantic Segmentation论文阅读笔记
  • 原文地址:https://www.cnblogs.com/LyShark/p/9148902.html
Copyright © 2020-2023  润新知