使用Python分割和编写二进制文件

时间:2011-11-18 22:53:37

标签: python binaryfiles

我有两个二进制输入文件,firstfilesecondfilesecondfilefirstfile +其他材料。我想在单独的文件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提供的另一个读取程序告诉我,或者我做错了。谢谢。

4 个答案:

答案 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)

  1. 您无需阅读origbytes,只需将文件指针移至正确的位置:f.seek(numbytes)
  2. 您不需要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'