我正在尝试比较两个文件中的数据,并检索差异所在位置的偏移列表。 我尝试了一些文本文件,它工作得很好.. 但是在非文本文件(仍然包含ascii文本)上,我称之为二进制数据文件。 (可执行文件,等等......)
似乎认为某些字节是相同的,即使我在十六进制编辑器中查看它们时,它们显然不是。我尝试打印出它认为相同的二进制数据,并且我得到了应该打印的空白行。 因此,我认为这是问题的根源。
那么比较可能是二进制文件还是包含ascii文本的数据字节的最佳方法是什么?我认为使用struct模块是一个起点...
如下所示,我将字节与==运算符
进行比较以下是代码:
import os
import math
#file1 = 'file1.txt'
#file2 = 'file2.txt'
file1 = 'file1.exe'
file2 = 'file2.exe'
file1size = os.path.getsize(file1)
file2size = os.path.getsize(file2)
a = file1size - file2size
end = file1size #if they are both same size
if a > 0:
#file 2 is smallest
end = file2size
big = file1size
elif a < 0:
#file 1 is smallest
end = file1size
big = file2size
f1 = open(file1, 'rb')
f2 = open(file2, 'rb')
readSize = 500
r = readSize
off = 0
data = []
looking = False
d = open('data.txt', 'w')
while off < end:
f1.seek(off)
f2.seek(off)
b1, b2 = f1.read(r), f2.read(r)
same = b1 == b2
print ''
if same:
print 'Same at: '+str(off)
print 'readSize: '+str(r)
print b1
print b2
print ''
#save offsets of the section of "different" bytes
#data.append([diffOff, diffOff+off-1]) #[begin diff off, end diff off]
if looking:
d.write(str(diffOff)+" => "+str(diffOff+off-2)+"\n")
looking = False
r = readSize
off = off + 1
else:
off = off + r
else:
if r == 1:
looking = True
diffOff = off
off = off + 1 #continue reading 1 at a time, until u find a same reading
r = 1 #it will shoot back to the last off, since we didn't increment it here
d.close()
f1.close()
f2.close()
#add the diff ending portion to diff data offs, if 1 file is longer than the other
a = int(math.fabs(a)) #get abs val of diff
if a:
data.append([big-a, big-1])
print data
答案 0 :(得分:4)
这个模块提供了类和 比较序列的功能。它 可用于例如比较 文件,并可以产生差异 各种格式的信息, 包括HTML和上下文和统一 diff文件。用于比较目录和 文件,另请参阅
filecmp
模块。filecmp模块定义了函数 比较文件和目录,用 各种可选的时间/正确性 权衡。有关比较文件,请参阅 还有
difflib
模块
答案 1 :(得分:0)
您可能遇到编码/解码问题。有人可能会建议一个更好的解决方案,但您可以尝试将文件读入bytearray
,这样您就可以读取原始字节而不是解码字符:
这是一个粗略的例子:
$ od -Ax -tx1 /tmp/aa
000000 e0 b2 aa 0a
$ od -Ax -tx1 /tmp/bb
000000 e0 b2 bb 0a
$ cat /tmp/diff.py
a = bytearray(open('/tmp/aa', 'rb').read())
b = bytearray(open('/tmp/bb', 'rb').read())
print "%02x, %02x" % (a[2], a[3])
print "%02x, %02x" % (b[2], b[3])
$ python /tmp/diff.py
aa, 0a
bb, 0a