将二进制文件拆分为两个文件

时间:2019-11-21 10:21:35

标签: python python-3.x

我对python不太熟悉,但是不得不写一个脚本将二进制文件吐到另外两个文件中。第一个文件应占第一个字节,第二个文件应占第二个字节。我编写了以下脚本,但是不知何故所有输出文件均为零。
你能帮忙吗?

from pip._vendor.msgpack.fallback import xrange

filePath = sys.argv[1]
yuv_string_bytes = bytes(open(filePath, 'rb').read())

file_uv = open("uv_buffer", "wb+")
file_y = open("y_buffer", "wb+")
for i in xrange(0, len(yuv_string_bytes), 2):
    uv = bytes(yuv_string_bytes[i])
    y = bytes(yuv_string_bytes[i+1])
    file_uv.write(uv)
    file_y.write(y)

file_y.close()
file_uv.close()

3 个答案:

答案 0 :(得分:2)

简单得多

yuv_string_bytes = bytes(open(filePath, 'rb').read())

with open("uv_buffer", "wb+") as f:
  f.write(yuv_string_bytes[::2])
with open("y_buffer", "wb+") as f:
  f.write(yuv_string_bytes[1::2])

答案 1 :(得分:1)

最节省内存的方法是逐字节读取输入文件,然后将该字节依次写入其他文件:

with open(sys.argv[1], 'rb') as yuv, \
        open('uv_buffer', 'wb') as uv, open('y_buffer', 'wb') as y:
    while True:
        b = yuv.read(2)
        if not b:
            break
        uv.write(b[:1])
        v.write(b[1:])

与将整个文件读入内存相比,它一次只能在内存中存储两个字节。您可以一次读取较大的块(例如10241024 * 1024),然后根据需要在CPU / IO和内存优化之间进行权衡取舍:

将它们从那里分发到两个文件中。

with open(sys.argv[1], 'rb') as yuv, \
        open('uv_buffer', 'wb') as uv, open('y_buffer', 'wb') as y:
    while True:
        b = yuv.read(1024)
        if not b:
            break
        uv.write(b[::2])
        y.write(b[1::2])

答案 2 :(得分:0)

您出错的问题是,bytes(n)构造了一个大小为n的字节对象(所有值均设置为0x00)。我可以从以下方式更改它:

uv = bytes(yuv_string_bytes[i])
y = bytes(yuv_string_bytes[i+1])

收件人:

uv = yuv_string_bytes[i].to_bytes(1, 'big')
y = yuv_string_bytes[i+1].to_bytes(1, 'big')

但是,就像其他人所说的那样,实现不是实现此目标的最佳方法。 Python具有许多功能来帮助进行此类字符串和数据操作。