#python #file
#python #файл
Вопрос:
У меня есть файл, содержащий несколько изображений. Изображения разделены на пакеты, я назвал packet chunk в моем примере кода. Каждый фрагмент содержит заголовок с: 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')
Комментарии:
1. Неясно, что работает, а что нет в вашем примере кода, или с какой проблемой вы сталкиваетесь. Пожалуйста, добавьте больше деталей, чтобы мы могли вам помочь.
2. Я изменил на описание проблемы. спасибо за любые предложения