python进行文件拷贝及compare,并html形式输出差异

python脚本:

#coding:utf-8
__author__ = '**'
import difflib
import webbrowser
import configparser
from bs4 import BeautifulSoup
# import pandas
# import numpy
import os
from shutil import copyfile

def check_diff(file1,file2,filename):
        # file1="D:/Python35/project/WebTest/files/med_node_1_svc.xml"
        # file2="D:/Python35/project/WebTest/files/med_node_1_svc2.xml"
        # file1="files/med_node_1_svc.xml"
        # file2="files/med_node_1_svc2.xml"
        resultPath="result"
        isExists=os.path.exists(resultPath)
        if not isExists:
        # # 如果不存在则创建目录
        #  # 创建目录操作函数
          os.makedirs(resultPath)
          print(resultPath+' 创建成功')
        print("file1:"+file1)
        print("file2:"+file2)

        with open(file1, 'r') as f:
            content1 = f.read().splitlines()
        with open(file2, 'r') as f:
            content2 = f.read().splitlines()
        htmlDiff = difflib.HtmlDiff(tabsize=2,wrapcolumn=100)
        tmp=resultPath+"/"+filename+'.html'    #比对结果文件以"被比对文件的名称"命名
        with open(tmp, 'w') as f:
             f.write(htmlDiff.make_file(content1, content2))
            # diff_tmp=htmlDiff.make_file(content1, content2)
            # f.write(htmlDiff.make_file(content1, content2))
        with open(tmp, 'r') as f2:
            soup = BeautifulSoup(f2.read(), 'html.parser')
            diff_add =soup.find_all(attrs={"class":"diff_add"})
            diff_chg =soup.find_all(attrs={"class":"diff_chg"})
            diff_sub =soup.find_all(attrs={"class":"diff_sub"})
            if(len(diff_add)>1 or len(diff_chg)>1 or len(diff_sub)>1):
                copyfile(tmp, filename+'.html')
                webbrowser.open(filename+'.html')
        # print(htmlDiff.make_file(content1, content2))

def compareFile():
    config=configparser.ConfigParser()
    config.read("files/filespath.conf")
    iemp_root=config.get("iEPM","iEPM_ROOT")
    bakfile=config.get("iEPM","bakfile")

    # #med_node_1_svc文件比较
    # med_node_1_svc_path=iemp_root+config.get("path","med_node_1_svc")  #获取要比对的文件在网管里的路径
    # med_node_1_svc_name=getfilename(med_node_1_svc_path)  #获取要比对的文件的名称,方便查找备份目录里对应哪个文件
    # check_diff("files/"+med_node_1_svc_name,med_node_1_svc_path,med_node_1_svc_name)
    #
    #  #fm.xml文件比较
    # fm_path=iemp_root+config.get("path","fm")  #获取要比对的文件在网管里的路径
    # fm_name=getfilename(fm_path)  #获取要比对的文件的名称,方便查找备份目录里对应哪个文件
    # check_diff("files/"+fm_name,fm_path,fm_name)

    #比对fm的配置文件
    if(config.has_section("FM") ):
      for key,value in config.items("FM"):
          item_path = iemp_root+value       #获取要比对的文件在网管里的路径
          item_name=getfilename(item_path)  #获取要比对的文件的名称,方便查找备份目录里对应哪个文件
          check_diff(bakfile+"/"+item_name,item_path,item_name)

    #比对Frame的配置文件
    if(config.has_section("Frame") ):
      for key,value in config.items("Frame"):
          item_path = iemp_root+value       #获取要比对的文件在网管里的路径
          item_name=getfilename(item_path)  #获取要比对的文件的名称,方便查找备份目录里对应哪个文件
          check_diff(bakfile+"/"+item_name,item_path,item_name)
          file1=open(bakfile+"/"+item_name, 'r')
          file2=open(item_path,'r')
          # diff file1 file2

    #比对nbi的配置文件
    if(config.has_section("nbi") ):
      for key,value in config.items("nbi"):
          item_path = iemp_root+value       #获取要比对的文件在网管里的路径
          item_name=getfilename(item_path)  #获取要比对的文件的名称,方便查找备份目录里对应哪个文件
          check_diff(bakfile+"/"+item_name,item_path,item_name)

    #比对sm的配置文件
    if(config.has_section("SM") ):
      for key,value in config.items("SM"):
          item_path = iemp_root+value       #获取要比对的文件在网管里的路径
          item_name=getfilename(item_path)  #获取要比对的文件的名称,方便查找备份目录里对应哪个文件
          check_diff(bakfile+"/"+item_name,item_path,item_name)

    #比对EAM的配置文件
    if(config.has_section("EAM") ):
      for key,value in config.items("EAM"):
          item_path = iemp_root+value       #获取要比对的文件在网管里的路径
          item_name=getfilename(item_path)  #获取要比对的文件的名称,方便查找备份目录里对应哪个文件
          check_diff(bakfile+"/"+item_name,item_path,item_name)

    #比对NM的配置文件
    if(config.has_section("NM") ):
      for key,value in config.items("NM"):
          item_path = iemp_root+value       #获取要比对的文件在网管里的路径
          item_name=getfilename(item_path)  #获取要比对的文件的名称,方便查找备份目录里对应哪个文件
          check_diff(bakfile+"/"+item_name,item_path,item_name)

    #比对auto的配置文件
    if(config.has_section("auto") ):
      for key,value in config.items("auto"):
          item_path = iemp_root+value       #获取要比对的文件在网管里的路径
          item_name=getfilename(item_path)  #获取要比对的文件的名称,方便查找备份目录里对应哪个文件
          check_diff(bakfile+"/"+item_name,item_path,item_name)

    #比对auto的配置文件
    if(config.has_section("Search") ):
      for key,value in config.items("Search"):
          item_path = iemp_root+value       #获取要比对的文件在网管里的路径
          item_name=getfilename(item_path)  #获取要比对的文件的名称,方便查找备份目录里对应哪个文件
          check_diff(bakfile+"/"+item_name,item_path,item_name)
    # ops=config.items("fm")
    # for item in ops:
    #     item_path=ops.index(item)


#根据文件路径截取最后面的文件名称
def getfilename(filepath):
    # n = filepath.ReverseFind('\\')
    strFileName =filepath.rsplit('/',1)[1]
    # filepath = filepath.Left(n);
    # strFileName = filepath.Right( filepath.GetLength()-(n+1) );
    return strFileName

#备份各特性需要关注的文件到files目录下
def bakfiles():
     print()
if __name__ == '__main__':
    bakfiles()
    compareFile()

对应filepath文件:

[iEPM]
iEPM_ROOT=D:\iEPM
bakfile=D:/Python35/project/WebTest/update/files


[Frame]
hornetq-configuration-cluster = /etc/iepm.framework/hornetq-configuration-cluster.xml
messaging-client-config = /etc/iepm.framework/messaging-client-config.xml
oms = /etc/oms.xml


[FM]
fm_config_1=/app/com.oms.app.fm/config/fm_config_1.xml
emailrule=/etc/oms.fm/emailrule.xml

html格式展现差异:

 

你可能感兴趣的:(python从零学习)