三、业务服务监控

三、业务服务监控

1.1两个字符串的差异对比

import difflib
#内置模块直接引用
text1 = """
This module provides classes and functionsfor comparing sequences.
including HTML and context and unified diffs8.
difflibdocument v7.4
"""

text2 = """
This module provides classes and functionsfor comparing sequences.
including HTML and context and unified diffs.
difflibdocument v7.5
add string
"""
text1_lines = text1.splitlines()
#按行进行分割,读取为列表格式,一行一个列表元素
text2_lines = text2.splitlines()
d = difflib.Differ()
#创建differ对象
diff = d.compare(text1_lines,text2_lines)
#使用compare方法对俩个字符串进行对比
print("\n".join(list(diff)))
#每一方diff内容中加入换行符方便查看,diff内容转义为list格式才可以看到内容
"""
符号含义
"-":包含在第一个序列行中,但不包含在第二个序列行
"+":包含在第二个序列行中,但不包含在第一个序列行
"":两个序列行一致
"?":行不存在于任一输入序列
"^":出两个序列行存在的差异字符
"""
"""
result:
  This module provides classes and functionsfor comparing sequences.          #表示此行俩个序列相同
- including HTML and context and unified diffs8.                             #俩个序列行中的尾单词存在差异,1有2没有
?                                             -

+ including HTML and context and unified diffs.
- difflibdocument v7.4                                                 #存在差异字符
?                    ^

+ difflibdocument v7.5
?                    ^

+ add string                                               #2有1没有
"""

1.2 生成美观的对比HTML文档

import difflib
text1 = """
This module provides classes and functionsfor comparing sequences.
including HTML and context and unified diffs8.
difflibdocument v7.4
"""

text2 = """
This module provides classes and functionsfor comparing sequences.
including HTML and context and unified diffs.
difflibdocument v7.5
add string
"""
text1_lines = text1.splitlines()
text2_lines = text2.splitlines()
d = difflib.HtmlDiff()
#生成html对象
print(d.make_file(text1_lines,text2_lines))
#转义为html类型

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-26g46zvN-1687774087931)(D:\py-资料\assetss\image-20230315170040597.png)]

1.2.1 nginx文件对比差异
import difflib
import os.path
import sys
#执行方式python diff.py /etc/nginx/nginx.conf /etc/nginx/nginx.conf_bak
try:
    textfile1 = "nginx.conf"
    # 第一个配置文件的路径
    # textfile1 = sys.argv[1]
    #linux下请使用sys模块调用位置参数
    textfile2 = "nginx.conf.bak"
    # textfile2 = sys.argv[2]
    #第二个配置文件路径
except Exception as e:
    print(f"\033[31m ERROR:{e}\033[0m")
    print("\033[33mUseage:simple3.py filename1 filename2\033[0m")
    exit(11)

def file(filename):
    try:
        fileHandle = open(filename,encoding="utf-8")
        #只读模式:以二进制方式读取文件,文件指针将会放在文件的开头
        text = fileHandle.read().splitlines()
        #读取文件后按行分割写入list
        fileHandle.close()
        #读取完成后关闭文件
        return text
        #返回读取后的内容
    except IOError as error:
        print(f"\033[31mRead file error:{error}\033[0m")
        exit(12)

if textfile1 == "" or textfile2 == "":
    print("\033[33mUseage:simple3.py filename1 filename2\033[0m")
    sys.exit(13)
text1_lines = readifile(textfile1)
#获取读取后的文件内容.通过上方定义的readfile函数处理位置变量1的文件
text2_lines = readifile(textfile2)
d = difflib.HtmlDiff()
#创建html类对象
html_word = d.make_file(text1_lines,text2_lines)
file = "test.html"
try:
    if not os.path.exists(file):
        with open(file, 'a+', encoding='utf-8') as fin:
            #写入模式:文件存在则会对文件内容进行追加(写在文件末尾),不存在则会创建文件,然后再写入内容
            fin.write(html_word)
except Exception as e:
    print(f"\033[31mERROR {e}[0m")
import webbrowser
webbrowser.open_new('test.html')
#建议提前将html文件的打开方式调整为浏览器.会找系统默认的打开方式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9Yjvs0po-1687774087934)(D:\py-资料\assetss\image-20230315174932774.png)]

1.3 文件与目录差异对比方法

1.3.1模块常用方法说明
filecmp提供了三个操作方法,分别为cmp(单文件对比)、cmpfiles(多文件对比)、dircmp(目录对比)
1.3.2 单文件对比
import filecmp

"cmp(单文件对比)"
"""
单文件对比,采用filecmp.cmp(fl,f2[,shallow])方法,比较文件名为fl和f2的文件,
相同返回True,不相同返回False,shallow默认为True,意思是只根据os.stat0方法
返回的文件基本信息进行对比,比如最后访问时间,修改时间,状态改变时间等,会忽略文件内容的对比.
当shallow为false时,os.stat()与文件内容同时进行校验
"""
f1 = r"D:\py-资料\devops\第二部分-业务服务监控详情\2.2-文件与目录差异对比方法\f1"
f2 = r"D:\py-资料\devops\第二部分-业务服务监控详情\2.2-文件与目录差异对比方法\f2"
f3 = r"D:\py-资料\devops\第二部分-业务服务监控详情\2.2-文件与目录差异对比方法\f3"
print(filecmp.cmp(f1,f2))
#单对比文件的差异,返回true或false
print(filecmp.cmp(f1,f3))
1.3.3 多文件对比
"cpms(多文件对比)"
"""
口多文件对比,采用filecmp.cmpfiles(dir1,dir2,common[,shallow])方法,对比dirl与
dir2目录给定的文件清单。该方法返回文件名的三个列表,分别为匹配、不匹配、错
误。匹配为包含匹配的文件的列表,不匹配反之,错误列表包活了目录不存在文件、
不具备读权限或其他原因导致的不能比较的文件清单。
"""
print(filecmp.cmpfiles("/root/python3/devops/mode","/root/python3/devops/mode-bak",["1.py","hhh.txt","1.sh","os.py"]))
##result (['1.py', 'os.py'], ['1.sh'], ['hhh.txt'])
#返回结果其中1.py和os.py文件匹配.1.sh文件不匹配存在差异,hhh.txt对应目录不存在无法比较
1.3.4 目录对比
"dircmp目录对比"
"""
目录对比,通过dircmp(a,b[,ignore[,hide]) 类创建一个目录比较对象,其中a和b是
参加比较的目录名。ignore代表文件名忽略的列表,并默认为[R0CS', 'CVS', 'tags']
hide代表隐藏的列表,默认为[os.curdir,os.pardir]。dircmp类可以获得目录比较的详
细信息,如只有在a目录中包括的文件、a与b都存在的子目录、匹配的文件等,同时支持递归。
"""
"案例对比俩个目录的区别:"
"""
默认方法输出报告的方法:
report():比较当前指定目录中的内容
report_partial_closure():比较当前指定目录及第一级子目录中的内容;
report_full_closure():递归比较所有指定目录的内容。
"""
import filecmp
a = r"C:\Users\LENOVO\Desktop\DevOps\项目1-python自动化办公\v1.0" #定义左目录
b = r"C:\Users\LENOVO\Desktop\DevOps\项目1-python自动化办公\v2.0" #定义右目录
dirobj = filecmp.dircmp(a,b,['env_listen.txt'])
#目录比较,忽略txt文件
dirobj.report()
#直接对比俩个目录,会输出相同的文件,不同内容文件,以及仅存在各个目录的文件
# dirobj.report_partial_closure()
# #比较当前指定目录及第一级子目录中的内容;
# dirobj.report_full_closure()
# #递归比较所有指定目录的内容
print("left_list:"+str(dirobj.left_list))
#左目录中的文件及目录列表
print("right_list:"+str(dirobj.right_list))
#右目录中的文件及目录列表
print("commone:"+str(dirobj.common))
#两边目录共同存在的文件或目录;
print("left_only:"+str(dirobj.left_only))
#只在左目录中的文件或目录;
print("right_only:"+str(dirobj.right_only))
#只在右目录中的文件或目录;(子目录中无法对比,只能是指定的一级目录进行对比)
print("common_dirs:"+str(dirobj.common_dirs))
#两边目录都存在的子目录
print("common_files:"+str(dirobj.common_files))
#两边目录都存在的子文件;
print("common_funny:"+str(dirobj.common_funny))
#两边目录都存在的子目录(不同目录类型或os.stat()记录的错吴);
print("same_files:"+str(dirobj.same_files))
#匹配相同的文件.当前目录
print("diff_files:"+str(dirobj.diff_files))
#当前目录下不同的文件(文件内容)
print("funny_files:"+str(dirobj.funny_files))
#,两边目录中都存在,但无法比较的文件;
print("subdirs:"+str(dirobj.common_dirs))
#目录名映射到新的dircmp对象,格式为字典类型。
1.3.5 实践:校验源与备份目录差异
#!/usr/bin/env python
#-*- coding: UTF-8 -*-
# """
# 功能概述:
# 有时候我们无法确认备份目录与源目录文件是否保持一致,包括源目录中的新文件或目录、更新文件或目录有无成功同步.
# 定期进行校验,没有成功则希望有针对性地进行备份。
# 本示例使用了filecmp模块的left_only、diff_files方法递归获取源目录的更新项。
# 再通过shutil.copyfile、os.makedirs方法对更新项进行复制,最终保持一致状态详细源码如下:
# """
import os,sys
import filecmp
import shutil
def check_dir(source_dir,bakcup_dir):
    try:
        if source_dir != bakcup_dir:  #遍历源目录中的所有子文件和子目录
            for root,dirs,files in os.walk(source_dir):
                bakcup_root = root.replace(source_dir,bakcup_dir,1)
                #构建备份目录中的对应主路径,将源路径替换为备份路径,root为父目录下的子目录
                #所有子目录都会被替换为back目录
                if not os.path.exists(bakcup_root):
                    os.makedirs(bakcup_root)
                    #如果对应的子目录不存在则创建
                    print(f"\033[34m创建目录:{bakcup_root}\033[0m")
                for file in files:
                    src_file = os.path.join(root,file)
                    #遍历所有文件获取文件的绝对路径
                    bakcup_file = os.path.join(bakcup_root,file)
                    #将所有文件修改为备份目录下的文件
                    if not os.path.exists(bakcup_file) or not filecmp.cmp(src_file,bakcup_file):
                        #如果文件不存在或单文件对比文件不一致则copy
                        shutil.copy2(src_file,bakcup_file)
                        print(f"\033[36m同步文件:{src_file}------------------>{bakcup_file}\033[0m")
    except Exception as e:
        print(f"\033[31m{e}\033[0m")
        exit(12)
    print(f"\033[32m{source_dir}<------------------------>{bakcup_dir}同步完成!!!\033[0m")
def main():
    if len(sys.argv) > 2:
        source_dir = os.path.abspath(sys.argv[1])
        backup_dir = os.path.abspath(sys.argv[2])
        check_dir(source_dir,backup_dir)
    else:
        print(f"\033[31mUsag:{sys.argv[0]} Sourcedir Backupdir\033[0m")
        exit(11)

if __name__ == '__main__':
    main()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

运维神经科主任

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值