Как читать из одного файла и записывать в несколько других файлов - PullRequest
0 голосов
/ 29 марта 2019

У меня есть файл, содержащий несколько изображений.Изображения разбиты на пакеты, я назвал пакетный блок в моем примере кода.Каждый кусок содержит заголовок с: count, uniqueID, start, length.Start содержит начальный индекс img_data в чанке, а length - длину img_data в чанке.Счетчик работает от 0 до 255, и img_data всех этих 256 кусков вместе образует одно изображение.Перед чтением чанков я открываю файл 'dummy.bin', чтобы ему было что писать, иначе я получаю, что f не определено.В конце я удаляю файл dummy.bin.Проблема в том, что для начала мне нужна ссылка на файл.Хотя этот код работает, мне интересно, есть ли другой способ создания фиктивного файла для получения ссылки на файл.Первый блок в test_file.bin имеет hdr ['count'] == 0, поэтому f.close () будет вызываться в первой итерации.Вот почему мне нужно иметь ссылку на файл f перед входом в цикл for.Кроме того, на каждой итерации я записываю img_data в файл с помощью f.write (img_data), здесь мне также нужна ссылка на файл, которую необходимо определить перед входом в цикл for, в случае, если у первого блока есть hdr ['count']! = 0. Это лучшее решение?как вы обычно читаете из файла и создаете несколько других файлов из него?

# read file, write several other files
import os

def read_chunks(filename, chunksize = 512):
    f = open(filename, 'rb')
    while True:
        chunk = f.read(chunksize)
        if chunk:
            yield chunk
        else:
            break

def parse_header(data):
    count = data[0]
    uniqueID = data[1]
    start = data[2]
    length = data[3]
    return {'count': count, 'uniqueID': uniqueID, 'start': start, 'length': length}

filename = 'test_file.bin'
f = open('dummy.bin', 'wb')
for chunk in read_chunks(filename):
    hdr = parse_header(chunk)
    if hdr['count'] == 0:
        f.close()
        img_filename = 'img_' + str(hdr['uniqueID']) + '.raw'
        f = open(img_filename, 'wb')
    img_data = chunk[hdr['start']: hdr['start'] + hdr['length']]
    f.write(img_data)
print(type(f))
f.close()
os.remove('dummy.bin')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...