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

2024-04-24 18:54:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我对python不是很熟悉,但必须编写一个脚本,将二进制文件放入另外两个文件中。第一个文件应该每1个字节读取一次,第二个文件应该每2个字节读取一次。我已经编写了以下脚本,但不知怎么的,所有输出文件都是零。
你能帮忙吗?你知道吗

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()

Tags: 文件脚本closestring字节bytesbufferopen
3条回答

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

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])

问题是bytes(n)构造了一个大小为n的byte对象(所有值都设置为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有很多特性可以帮助处理这种字符串和数据操作。你知道吗

简单多了

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])

相关问题 更多 >