我有两个二进制输入文件,firstfile
和secondfile
。 secondfile
是firstfile
+其他材料。我想在单独的文件newfile
中隔离这些附加材料。这就是我到目前为止所做的:
import os
import struct
origbytes = os.path.getsize(firstfile)
fullbytes = os.path.getsize(secondfile)
numbytes = fullbytes-origbytes
with open(secondfile,'rb') as f:
first = f.read(origbytes)
rest = f.read()
当然,我倾向于做(这似乎有效):
with open(newfile,'wb') as f:
f.write(rest)
我找不到它,但我认为我在读到SO时应首先使用struct.pack
打包,然后再写入文件。以下给出了一个错误:
with open(newfile,'wb') as f:
f.write(struct.pack('%%%ds' % numbytes,rest))
-----> error: bad char in struct format
但这有效:
with open(newfile,'wb') as f:
f.write(struct.pack('c'*numbytes,*rest))
对于那些有效的,这给了我正确的答案
with open(newfile,'rb') as f:
test = f.read()
len(test)==numbytes
-----> True
这是写二进制文件的正确方法吗?我只是想确保我正确地执行这一部分以诊断文件的第二部分是否已损坏,因为我正在向newfile
提供的另一个读取程序告诉我,或者我做错了。谢谢。
答案 0 :(得分:3)
如果您知道secondfile与firstfile +附加数据相同,为什么甚至读取secondfile的第一部分?
with open(secondfile,'rb') as f:
f.seek(origbytes)
rest = f.read()
至于写出来的东西,
with open(newfile,'wb') as f:
f.write(rest)
很好。 struct
的内容无论如何都只是一个无操作的东西。您唯一可以考虑的是rest
的大小。如果它可能很大,您可能希望以块的形式读取和写入数据。
答案 1 :(得分:2)
没有理由使用struct
模块,该模块用于在二进制格式和Python对象之间进行转换。这里不需要转换。
Python 2.x中的字符串只是一个字节数组,可以在文件中读写。 (在Python 3.x中,如果用bytes
打开文件,则read函数返回open(filename, 'rb')
对象,这是相同的。)
所以你可以把文件读成一个字符串,然后再写一遍:
import os
origbytes = os.path.getsize(firstfile)
fullbytes = os.path.getsize(secondfile)
numbytes = fullbytes-origbytes
with open(secondfile,'rb') as f:
first = f.seek(origbytes)
rest = f.read()
with open(newfile,'wb') as f:
f.write(rest)
答案 2 :(得分:1)
origbytes
,只需将文件指针移至正确的位置:f.seek(numbytes)
struct
打包,将rest
写入newfile
。答案 3 :(得分:0)
这不是c,格式字符串中没有%。你想要的是:
f.write(struct.pack('%ds' % numbytes,rest))
它对我有用:
>>> struct.pack('%ds' % 5,'abcde')
'abcde'
说明:'%%%ds' % 15
为'%15s'
,而您想要的是'%ds' % 15
'15s'