我有两个二进制文件。它们看起来像这样,但数据更随机:
档案A:
FF FF FF FF 00 00 00 00 FF FF 44 43 42 41 FF FF ...
档案B:
41 42 43 44 00 00 00 00 44 43 42 41 40 39 38 37 ...
我想要的是打电话:
>>> someDiffLib.diff(file_a_data, file_b_data)
并收到类似的内容:
[Match(pos=4, length=4)]
表示在两个文件中,位置4的字节对于4个字节是相同的。序列44 43 42 41
不匹配,因为它们在每个文件中的位置不同。
是否有一个库可以为我做差异?或者我应该编写循环来进行比较?
答案 0 :(得分:10)
您可以使用itertools.groupby()
,这是一个示例:
from itertools import groupby
# this just sets up some byte strings to use, Python 2.x version is below
# instead of this you would use f1 = open('some_file', 'rb').read()
f1 = bytes(int(b, 16) for b in 'FF FF FF FF 00 00 00 00 FF FF 44 43 42 41 FF FF'.split())
f2 = bytes(int(b, 16) for b in '41 42 43 44 00 00 00 00 44 43 42 41 40 39 38 37'.split())
matches = []
for k, g in groupby(range(min(len(f1), len(f2))), key=lambda i: f1[i] == f2[i]):
if k:
pos = next(g)
length = len(list(g)) + 1
matches.append((pos, length))
或者使用列表理解与上面相同:
matches = [(next(g), len(list(g))+1)
for k, g in groupby(range(min(len(f1), len(f2))), key=lambda i: f1[i] == f2[i])
if k]
如果您使用的是Python 2.x,则以下是该示例的设置:
f1 = ''.join(chr(int(b, 16)) for b in 'FF FF FF FF 00 00 00 00 FF FF 44 43 42 41 FF FF'.split())
f2 = ''.join(chr(int(b, 16)) for b in '41 42 43 44 00 00 00 00 44 43 42 41 40 39 38 37'.split())
答案 1 :(得分:3)
提供的conn.send('app#YourReceivingAppName:_connection', 'fire','myString');
solution工作正常,但速度很慢。
我使用itertools.groupby
编写了一个非常天真的尝试,并测试了它与我碰巧拥有的特定16MB文件上的其他解决方案,并且它在我的机器上快了大约42倍。熟悉numpy
的人可能会显着改善这一点。
numpy