У меня есть файл, содержащий несколько изображений.Изображения разбиты на пакеты, я назвал пакетный блок в моем примере кода.Каждый кусок содержит заголовок с: 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')