逐⾏读⽂件_⽤python⽐较两个⽂件的内容是否相同
有两个⽂件,考虑编写算法,尽可能快的⽐较这两个⽂件的内容是否相同。看起来这是⼀个⾮常简单的事情,但仔细思考就会发现,有很多可以琢磨的地⽅。我在学习filecmp模块的cmp⽅法时,阅读它的源码,感慨于作者的思路之缜密,决定写下这篇⽂章与你分享这其中的奥妙之处。
最容易想到的⽅法就是读取这两个⽂件的内容,然后进⾏⽐较,可如果⽂件内容很⼤怎么办?读取⼏个G的内容进⾏⽐较是否相等,即便内存上可以接受,算法性能也不能接受。
考虑计算两个⽂件的MD5值并进⾏⽐较,弊端和上⾯所说的⼀样,遇到⼤⽂件时效率太低。
python怎么读的考虑算法时,⼀个⾏之有效的提升性能的⽅法是将那些简单但有效的逻辑放在最前⾯,以期能⽤最⼩的代价针对部分输⼊得出计算结果,就这个算法⽽⾔,可以先考虑⽐较两个⽂件的⼤⼩,如果⽂件⼤⼩都不同,那么⽂件内容也就没必要⽐较了。
如果⽂件⼤⼩相同,那么就只能⽐较⽂件的内容了,但不应该⼀次性读取整个⽂件的内容,这样太耗费内存。两个⽂件也许在靠前的内容就已经不同,没必要全部读取。有⼈想到逐⾏⽐较,这个⽅法看起来可⾏,实则存在弊端,⼀来,我们只对⽂本⽂件按⾏读取,⼆来,⼀⾏数据最⼤可以有多少个字符,操作系统是没有什么限制的,还是存在内存上的困扰。
最合理的做法是,以⼆进制读的⽅式打开⽂件,每次读取固定⼤⼩的数据,逐块来⽐较,这样,不论⽂件是何种类型,都可以快速进⾏⽐较。虽然只是⼀件⾮常⼩的事情,但整个分析的过程却能考察⼀个⼈的功⼒,细细揣摩,当真收获很多,以下是⽰例代码,感兴趣的可以阅读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 = ad(bufsize) # 读取指定⼤⼩的数据进⾏⽐较
b2 = ad(bufsize)
if b1 != b2:
return False
if not b1:
return True
print(cmp_file('./', './'))
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论