用python比较两个文件的内容是否相同

有两个文件,考虑编写算法,尽量快的比较这两个文件的内容是否相同。看起来这是一个很是简单的事情,但仔细思考就会发现,有不少能够琢磨的地方。我在学习filecmp模块的cmp方法时,阅读它的源码,感慨于做者的思路之缜密,决定写下这篇文章与你分享这其中的奥妙之处。
最容易想到的方法就是读取这两个文件的内容,而后进行比较,可若是文件内容很大怎么办?读取几个G的内容进行比较是否相等,即使内存上能够接受,算法性能也不能接受。
考虑计算两个文件的MD5值并进行比较,弊端和上面所说的同样,遇到大文件时效率过低。
考虑算法时,一个行之有效的提高性能的方法是将那些简单但有效的逻辑放在最前面,以期能用最小的代价针对部分输入得出计算结果,就这个算法而言,能够先考虑比较两个文件的大小,若是文件大小都不一样,那么文件内容也就不必比较了。
若是文件大小相同,那么就只能比较文件的内容了,但不该该一次性读取整个文件的内容,这样太耗费内存。两个文件也许在靠前的内容就已经不一样,不必所有读取。有人想到逐行比较,这个方法看起来可行,实则存在弊端,一来,咱们只对文本文件按行读取,二来,一行数据最大能够有多少个字符,操做系统是没有什么限制的,仍是存在内存上的困扰。
最合理的作法是,以二进制读的方式打开文件,每次读取固定大小的数据,逐块来比较,这样,不论文件是何种类型,均可以快速进行比较。
虽然只是一件很是小的事情,但整个分析的过程却能考察一我的的功力,细细揣摩,当真收获不少,如下是示例代码,感兴趣的能够阅读filecmp的源码。
import os

def cmp_file(f1, f2):
st1 = os.stat(f1)
st2 = os.stat(f2)

# 比较文件大小
if st1.st_size != st2.st_size:
return False

bufsize = 8*1024
with open(f1, 'rb') as fp1, open(f2, 'rb') as fp2:
while True:
b1 = fp1.read(bufsize) # 读取指定大小的数据进行比较
b2 = fp2.read(bufsize)
if b1 != b2:
return False
if not b1:
return True

print(cmp_file('./data/1.txt', './data/2.txt'))


本文分享自微信公众号 - coolpython(coolpython)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。python

相关文章
相关标签/搜索