Разделить двоичный файл на два файла - PullRequest
0 голосов
/ 21 ноября 2019

Я не очень знаком с 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()

Ответы [ 3 ]

2 голосов
/ 21 ноября 2019

Гораздо проще

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 голос
/ 21 ноября 2019

Самый эффективный способ памяти - это читать байты байта входного файла и записывать этот байт в другие файлы по очереди:

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])
0 голосов
/ 21 ноября 2019

Проблема, в которой вы ошибаетесь, заключается в том, что 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 есть много функций, которые помогут с такими манипуляциями со строками и данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...