操作系统 macOS Catalina
Python版本:3.7
所有代码可在 GitHub 获取
文件与目录差异对比方法
1. 文件内容差异对比方法
python中可以通过 difflib 模块实现文件文件内容差异对比。difflib 作为 python 的标准库模块,无需安装,作用是对比文本之间的差异,且支持输出可读性比较强的 HTML 文档,与 Linux 下的 diff 命令相似。
两个字符串的差异对比
import difflib
text1 = """text1:
This module provides classes and functions for comparing sequences.
including HTML and context and unified diffs.
difflib document v7.4
add string
"""
text1_lines = text1.splitlines() # 以行进行分隔,以便进行对比
text2 = """text2"
This module provides classes and functions for comparing sequences.
including HTML and context and unified diffs.
difflib document v7.5
"""
text2_lines = text2.splitlines()
d = difflib.Differ() # 创建 Differ() 对象
diff = d.compare(text1_lines, text2_lines) # 采用 compare 方法对字符串进行比较
print('\n'.join(list(diff)))
执行结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-heAaBtiT-1586326477339)(https://i.loli.net/2020/04/01/ad3cz5oVe78WXnS.png)]
结果中有一些符号,下面进行说明:
符号 | 含义 |
---|---|
‘-’ | 包含在第一个序列中,但不包含在第二个序列中 |
‘+’ | 包含在第二个序列中,但不包含在第一个序列中 |
’ ’ | 两个序列行一致 |
‘?’ | 标志两个序列行存在增量差异 |
‘^’ | 标志处两个序列行存在差异字符 |
生成 HTML 格式文档
采用 HtmlDiff() 类的 make_file()方法就可以生成 HTML 文档,对上述代码进行修改,将输出写入文件
import difflib
text1 = """text1:
This module provides classes and functions for comparing sequences.
including HTML and context and unified diffs.
difflib document v7.4
add string
"""
text1_lines = text1.splitlines() # 以行进行分隔,以便进行对比
text2 = """text2:
This module provides classes and functions for comparing sequences.
including HTML and context and unified diffs.
difflib document v7.5
"""
text2_lines = text2.splitlines()
d = difflib.HtmlDiff() # 创建对象
html = open("./diff.html", mode='w+') # 写入文件
html.write(d.make_file(text1_lines, text2_lines))
html.close()
执行后在同级目录会生成一个 diff.html 文件,打开文件显示如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R52OVWhA-1586326477340)(https://i.loli.net/2020/04/01/fqySxAUlQ23nDi4.png)]
2. 文件目录差异对比方法
当我们进行代码审计或校验备份结果的时候,往往需要检查原始与目标目录的文件一致性,Python 的标准库 filecmp 可以满足此需求。filecmp 可以实现文件、目录、便利子目录的差异对比功能。
模块常用方法说明
filecmp 提供了三个操作方法:
- 单文件对比(cmp),采用 filecmp.cmp(f1,f2[,shallow])比较两个文件,相同返回 True,不相同返回 False,shallow 默认为 True,意思只根据 os.stat()返回的文件基本信息进行对比,不对内容进行比较
- 多文件对比,采用 filecmp.cmpfiles(dir1,dir2,common[,shallow])方法,对比 dir1 与 dir2 目录给定的文件清单。该方法返回文件名的三个列表,分别为匹配、不匹配、错误。匹配为包含匹配的文件的列表,不匹配反之,错误列表包括了目录不存在文件,不具备读权限或其他原因导致不能比较的文件清单
- 目录对比,通过 dircmp(a,b[,ignore[,hide]])类创建一个目录比较对象,其中 a 和 b 是参加比较的目录名。ignore 代表文件名忽略的列表,并默认为[‘RCS’,‘CVS’,‘tags’];hide 代表隐藏的列表。
下面写个例子实现目录差异对比功能,同时输出目录对比对象所有属性信息。
import filecmp
a = "/Users/shenwenqiang/Desktop/dir1" # 定义左目录,这里的目