将两个二进制文件合并为第三个二进制文件

Posted

技术标签:

【中文标题】将两个二进制文件合并为第三个二进制文件【英文标题】:Merge Two Binary Files Into Third Binary File 【发布时间】:2020-09-14 22:07:03 【问题描述】:

我正在尝试将两个二进制文件合并到 Python 中的第三个二进制文件。我的代码:

input1 = input2 = ""

input1 = open('input1.bin').read()
input2 = open('input2.bin').read()

input1 += input2 

with open('Output.bin', 'w') as fp:
    fp.write(input1)

这段代码没有给我任何错误,但这没有产生预期的输出。

如果我写了批处理命令来合并文件:

copy /b input1.bin+input2.bin Output.bin

此命令生成大小为 150KB 的 Output.bin,而早期的 python 命令将输出文件大小为 151KB。

我也试过了:

with open('Output.bin', 'wb') as fp:
    fp.write(input1)

即使用二进制模式编写,但这给了我错误:

TypeError: a bytes-like object is required, not 'str'

什么是正确的过程?


参考这个早期的错误:TypeError: a bytes-like object is required, not 'str' when writing to a file in Python3

此解决方案不起作用


使用 Python 3.7

【问题讨论】:

读取二进制文件时,应以'b'二进制模式打开。即open('input1.bin', 'rb').read() 这将为您提供字节对象而不是字符串。 【参考方案1】:

出现此错误的原因(TypeError: a bytes-like object is required, not 'str' when writing to a file in Python3)是因为: 您以文本模式(这是默认模式)读取文件,因此 input1 和 input2 变成了字符串,您尝试以二进制模式将它们写回(您需要 input1 是类似字节的对象)。一种方法是以二进制模式读取文件本身,如下所示。

# Try reading the file in binary mode and writing it back in binary 
# mode. By default it reads files in text mode  
input1 = open('input1.bin', 'rb').read()
input2 = open('input2.bin', 'rb').read()

input1 += input2 

with open('Output.bin', 'wb') as fp:
    fp.write(input1)

【讨论】:

以文本格式读取文件是导致主要错误的原因。感谢您指出这一点。【参考方案2】:

我相信这应该打开两个输入文件,分块读取它们,然后写入一个输出文件:

from shutil import copyfileobj
from io import DEFAULT_BUFFER_SIZE

with open('input1.bin', 'rb') as input1, open('input2.bin', 'rb') as input2, open('output.bin', 'wb') as output:
    copyfileobj(input1, output, DEFAULT_BUFFER_SIZE)
    copyfileobj(input2, output, DEFAULT_BUFFER_SIZE)

【讨论】:

以上是关于将两个二进制文件合并为第三个二进制文件的主要内容,如果未能解决你的问题,请参考以下文章

协议缓冲区 - 将具有相同 .proto 文件的二进制数据文件合并到一个文件中

将多个源文件合并为一个胖二进制文件的简单方法

抽象工厂

如何将几个二进制文件合成一个?

TS文件极简合并

合并两个文件,替换文件,获取文件大小