如何将DeepDiff输出转为类GitHub风格的终端可读JSON差异
类GitHub风格的DeepDiff终端差异展示
需求说明
DeepDiff默认输出格式仅适合小型人工审核:
{'dictionary_item_added': [root[5], root[6]], 'dictionary_item_removed': [root[4]]}
我们需要在支持ANSI颜色的终端中,以-/+行展示JSON结构差异,并高亮变更内容。
放弃使用git-diff的原因:JSON不关心格式和键顺序,用git-diff需要先排序字典、写入磁盘再调用外部命令,操作繁琐;直接调用DeepDiff(t1, t2)的方式更简洁。
示例基础代码:
from deepdiff import DeepDiff t1 = {1:1, 3:3, 4:4} t2 = {1:1, 3:3, 5:5, 6:6} ddiff = DeepDiff(t1, t2) print(ddiff)
Python实现方案
以下代码将DeepDiff结果转换成类GitHub的差异格式,支持终端颜色高亮:
from deepdiff import DeepDiff # ANSI颜色码定义 RED = "\033[91m" GREEN = "\033[92m" RESET = "\033[0m" def format_deepdiff(t1, t2): ddiff = DeepDiff(t1, t2) output = [] # 处理被移除的项 if 'dictionary_item_removed' in ddiff: for item in ddiff['dictionary_item_removed']: key = item.split('[')[1].split(']')[0] value = t1[int(key)] output.append(f"{RED}- {key}: {value}{RESET}") # 处理新增的项 if 'dictionary_item_added' in ddiff: for item in ddiff['dictionary_item_added']: key = item.split('[')[1].split(']')[0] value = t2[int(key)] output.append(f"{GREEN}+ {key}: {value}{RESET}") # 处理值变更的项 if 'values_changed' in ddiff: for path, change in ddiff['values_changed'].items(): key = path.split('[')[1].split(']')[0] old_val = change['old_value'] new_val = change['new_value'] output.append(f"{RED}- {key}: {old_val}{RESET}") output.append(f"{GREEN}+ {key}: {new_val}{RESET}") return '\n'.join(output) # 测试示例 if __name__ == "__main__": t1 = {1:1, 3:3, 4:4} t2 = {1:1, 3:5, 5:5, 6:6} print(format_deepdiff(t1, t2))
代码说明
- 用ANSI转义码实现终端颜色区分:红色标记移除项,绿色标记新增/变更后的项,最后重置颜色
- 解析DeepDiff返回的路径字符串(如
root[4])提取字典键 - 分别处理
dictionary_item_removed、dictionary_item_added、values_changed三种差异类型,生成对应-/+行 - 支持字典值变更的高亮展示,同时显示旧值和新值
运行上述代码后,终端会输出带颜色的差异行,效果类似GitHub PR中的代码对比。
内容的提问来源于stack exchange,提问作者Aleksandr Levchuk
相关产品推荐
相关产品推荐

