我对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()
答案 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:])
与将整个文件读入内存相比,它一次只能在内存中存储两个字节。您可以一次读取较大的块(例如1024
或1024 * 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具有许多功能来帮助进行此类字符串和数据操作。