一、🚀ComparativeData 简介
ComparativeData 是一个基于 Python 开发的轻量级数据对比工具,专为开发者和数据分析师设计。它能够智能比较字符串、列表、字典等多种数据类型,并以直观的方式展示差异,是代码调试、数据校验的得力助手。
✨ 核心功能
| 功能方法 | 适用数据类型 | 技术实现 | 输出形式 |
|---|---|---|---|
| compar_str() | 字符串 | difflib.Differ | 行内差异标记 |
| compar_list() | 列表 | DeepDiff | 结构化差异报告 |
| compar_dict() | 字典 | DeepDiff | 键值差异详情 |
二、🛠️ 技术实现解析
2.1、 字符串对比(行级差异分析)
@staticmethod
def compar_str(str1, str2):
"""智能比对两个字符串的差异"""
differ = difflib.Differ()
diff = list(differ.compare(str1.split(), str2.split()))
print("\n".join(diff)) # 可视化输出差异
技术亮点:
- 使用 Python 标准库 difflib
- 自动分割字符串进行词级比对
- 输出带标记的差异结果(+、-、?)
2.2、 列表/字典对比(结构化差异检测)
@staticmethod
def compar_dict(dict1, dict2):
"""深度比对字典结构差异"""
diff = DeepDiff(dict1, dict2)
print(diff) # 输出完整差异报告
技术亮点:
- 基于 DeepDiff 进行递归深度比较
- 自动识别类型变化、值变化、结构变化
- 支持嵌套数据结构比对
2.3、 完整代码
#!/usr/bin/python
# -*- coding: utf-8 -*-
# @Users: LiMu
# @Files:comparative_data.py
# @Times: 2025/6/26
# @Software:PyCharm
import os
import json
import time
import random
import difflib
from deepdiff import DeepDiff
class ComparativeData:
@staticmethod
def compar_str(str1,str2):
"""
:compar_str:比较字符串
:param str1: 字符串1
:param str2: 字符串2
:return: 无返回
"""
differ = difflib.Differ()
diff = list(differ.compare(str1.split(), str2.split()))
print("\n".join(diff)) # 输出差异对比
@staticmethod
def compar_list(list1,list2):
"""
:compar_list:比较列表
:param list1: 列表1
:param list2: 列表2
:return: 无返回
"""
diff = DeepDiff(list1, list2)
print(diff)
@staticmethod
def compar_dict(dict1,dict2):
"""
:compar_dict:比较字典
:param dict1: 字典1
:param dict2: 字典2
:return: 无返回
"""
diff = DeepDiff(dict1, dict2)
print(diff)
if __name__ == '__main__':
str1,str2 = "66a6","66b6"
list1,list2 = ["a","b"],["a","c"]
dict1,dict2 = {"a":1,"b":2,"c":4},{"a":1,"b":3,"d":4}
ComparativeData.compar_str(str1,str2)
ComparativeData.compar_list(list1,list2)
ComparativeData.compar_dict(dict1,dict2)
三、🌟 使用场景案例
案例1:接口测试验证
# 比对预期响应和实际响应
expected = {"code": 200, "data": [...]}
actual = requests.get(api_url).json()
ComparativeData.compar_dict(expected, actual)
案例2:配置文件变更审计
# 比较新旧版本配置
with open('config_v1.json') as f1, open('config_v2.json') as f2:
old_conf = json.load(f1)
new_conf = json.load(f2)
ComparativeData.compar_dict(old_conf, new_conf)
四、📌 使用建议
可在原来的基础上增加文件对比功能
@staticmethod
def compar_file(file1_path, file2_path, output_diff=False):
"""
比对两个文本文件的差异
:param file1_path: 文件1路径
:param file2_path: 文件2路径
:param output_diff: 是否输出到文件
:return: 差异内容/文件路径
"""
with open(file1_path) as f1, open(file2_path) as f2:
lines1 = f1.readlines()
lines2 = f2.readlines()
diff = difflib.unified_diff(
lines1, lines2,
fromfile=file1_path,
tofile=file2_path,
lineterm='')
result = '\n'.join(diff)
if output_diff:
diff_path = f"diff_{int(time.time())}.patch"
with open(diff_path, 'w') as f:
f.write(result)
return diff_path
return result