文件对比的脚本

脚本要求:

/data/myapp/confs这个目录下有N个子目录,总共几千个由脚本生成的配置文件,其中可能有不知道在什么时候某些文件被人为的修改过。

现在用脚本生成一批新的配置文件在/data/myapp/confs.new目录下(内容不变)

现在写一个脚本完成以下功能:

1、找出/data/myapp/confs目录中被人为修改过的文件;

2、找出被修改的内容;

3、要求考虑目录层级(可能超级深)、文件大小(可能很大、很多)、考虑执行效率、最小化内存消耗;

#!/usr/bin/python
# -*- coding: utf-8 -*-
# 2020-3-16
# author:hhh

import os,sys
import filecmp
import difflib

diff_file_list = []
#定义空列表,用来储存不匹配文件路径


# 对比目录函数
def compare_dir(dir1, dir2):
    dirobj = filecmp.dircmp(dir1, dir2)
    #通过filecmp函数对比目录
    only_in_dir1 = dirobj.left_only
    #出现的新的配置文件
    diff_in_dir = dirobj.diff_files
    #不匹配文件,被人为修改的文件
    [diff_file_list.append(os.path.abspath(os.path.join(dir1, x))) for x in only_in_dir1]
    [diff_file_list.append(os.path.abspath(os.path.join(dir1, x))) for x in diff_in_dir]
    # 将两个目录对比的不匹配的文件或目录追加到diff_file_list
    if len(dirobj.common_dirs) > 0:
        # 判断是否存在相同子目录,以便递归
        for item in dirobj.common_dirs:
            # 递归子目录
            compare_dir(os.path.abspath(os.path.join(dir1, item)), os.path.abspath(os.path.join(dir2, item)))
    return diff_file_list
    #返回不匹配文件列表

# 读取文件函数
def file_reader(fname, block_size=1024):
    with open(fname) as f:
        while True:
            data = f.read(block_size)
            # 使用read每次读取1024个
            if not data:
                break
            yield data

# 文件对比函数
def diff_file(file1,file2):
    diff = difflib.HtmlDiff()
    # 创建htmldiff对象
    file1_lines = file_reader(file1)
    file2_lines = file_reader(file2)
    # 读取file1,file2的文件
    result = diff.make_file(file1_lines, file2_lines)  # 通过make_file方法输出html 格式的对比结果
    # 将结果写入到result_comparation.html文件中
    try:
        with open('result_comparation.html', 'a+') as result_file:
            result_file.write(file1)
            # 写入file1文件名,便于区分
            result_file.write(result)
            print("0==}==========> Successfully Finished
")
    except IOError as error:
        print('写入html文件错误:{0}'.format(error))




def main():
    # 定义dir1和dir2的路径
    dir1 = "/data/myapp/confs"
    dir2 = "/data/myapp/confs.new"
    # 执行对比目录函数
    diff_files = compare_dir(dir1, dir2)
    print("被人工修改的文件有:",diff_files)
    # 执行对比文件函数
    for file1 in diff_files:
        # file2 = file1.replace("confs","confs.new",1)
        file2 = file1.replace("dir1","dir2",1)
        # 修改字符串,匹配第一个confs
        diff_file(file1,file2)


if __name__ == '__main__':
    main()

  

原文地址:https://www.cnblogs.com/guantou1992/p/12618393.html