巧用Python自带difflib模块

liftword3个月前 (04-09)技术文章19

官方文档:
https://docs.python.org/3/library/difflib.html

difflib模块的作用是比对文本之间的差异,且支持输出可读性比较强的HTML文档,与Linux下的vimdiff命令相似。

vimdiff效果如下:

在接口测试时,常常需要对不同版本的同一个接口的response进行比对,来验证新版本的功能可靠性。接口数量多,加之vimdiff命令输出的结果读起来不是很友好,这时python自带的difflib模块就可以发挥作用了。

difflib.Differ

import difflib
text1 = '''  yi hang
            er hang
     '''.splitlines(keepends=True)

text2 = '''  yi hang
            er han
            san hang
     '''.splitlines(keepends=True)

d = difflib.Differ()             # 创建Differ 对象
result = list(d.compare(text1, text2))
result = "".join(result)
print(result)

结果:

注释:

difflib.HtmlDiff

import difflib
import sys
import argparse

# 读取要比较的文件
def read_file(file_name):
    try:
        file_desc = open(file_name, 'r')
        # 读取后按行分割
        text = file_desc.read().splitlines()
        file_desc.close()
        return text
    except IOError as error:
        print('Read input file Error: {0}'.format(error))
        sys.exit()

# 比较两个文件并把结果生成一个html文件
def compare_file(file_1, file_2):
    if file_1 == "" or file_2 == "":
        print('文件路径不能为空:第一个文件的路径:{0}, 第二个文件的路径:{1} .'.format(file_1, file_2))
        sys.exit()
    else:
        print("正在比较文件{0} 和 {1}".format(file_1, file_2))
    text1_lines = read_file(file_1)
    text2_lines = read_file(file_2)
    diff = difflib.HtmlDiff()           # 创建HtmlDiff 对象
    result = diff.make_file(text1_lines, text2_lines)   # 通过make_file 方法输出 html 格式的对比结果
    # 将结果写入到result_compare.html文件中
    try:
        with open('result_compare.html', 'w') as result_file:
            result_file.write(result)
            print("比较完成")
    except IOError as error:
        print('写入html文件错误:{0}'.format(error))

if __name__ == "__main__":
    # To define two arguments should be passed in, and usage: -f1 f_name1 -f2 f_name2
    my_parser = argparse.ArgumentParser(description="传入两个文件参数")
    my_parser.add_argument('-f1', action='store', dest='f_name1', required=True)
    my_parser.add_argument('-f2', action='store', dest='f_name2', required=True)
    # retrieve all input arguments
    given_args = my_parser.parse_args()
    file1 = given_args.f_name1
    file2 = given_args.f_name2
    compare_file(file1, file2)

result_compare.html效果:

注意:当接口response返回的行数很多,difflib可能会发生比对错行,导致比对结果不准确,不妨去试一试xmldiff和json-diff

相关文章

了解 Python 最常见的内置函数

Python 的内置函数基础Python 的内置函数是该语言不可或缺的一部分,无需额外的库即可提供基本功能。这些函数始终可用,无需导入任何模块即可使用。它们是在 C for CPython(标准 Py...

8-Python内置函数

Python 提供了丰富的内置函数,这些函数可以直接使用而无需导入任何模块。以下是一些常用的内置函数及其示例:1-print()1-1-说明输出指定的信息到控制台。1-2-例子2-len()2-1-说...

Python进阶-Day5:模块与包

学习目标掌握创建和导入自定义模块的方法。理解 __name__ == "__main__" 的用途和原理。能够创建一个简单的模块化计算器程序。学习内容与任务1. 理论学习自定义模块:在 Python...

python应用之内置hashlib库的哈希算法介绍

hashlib 是 Python 的一个内置模块,提供了像 SHA1, SHA256, MD5 等哈希算法。可以接受任意长度的字节数据作为输入,并输出一个固定长度的“哈希值”,通常用于校验数据的完整性...

Python实现极简Web服务器:从一行代码到生产级部署

Python实现极简Web服务器:从一行代码到生产级部署一、引言:为什么用Python写Web服务器?在这个框架林立的时代,为什么还要用Python原生代码实现Web服务器?这不仅是学习HTTP协议的...