python 实现文件同步

操作系统 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"  # 定义左目录,这里的目
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值