LINUX.ORG.RU

Структуры в numpy с варьируемым числом элементов

 ,


0

1

Есть файлы-архивы от старой игры. Формат следующий:
2 байта — число файлов в архиве, N;
24 байта — [('filename', 'S12'), ('time', '<i4'), ('length', '<i4'), ('offset', '<i4')] повторяется N раз;
остальное — собственно упакованные файлы.

Как это всё поаккуратнее и покороче описать средствами numpy? Знаю, что можно сделать

a = np.memmap('archive.dat', mode='r')
cat_header = np.dtype([('filename','S12'), ('time','<i4'), ('length','<i4'), ('offset','<i4')])
N = a[0:2].view(dtype='<u2')[0]
b = a[2 : 2 + cat_header.itemsize*N].view(cat_header)

и извлекать содержимое i-го файла выражением вида a[b[i]['offset'] : b[i]['offset'] + b[i]['length']]. А ещё удобнее сделать можно?

★★★★★

Ответ на: комментарий от question4

Как-то так

class fileobj(object):
	def __init__(self, fname):
		self.a = ...
		self.b = ...
	def __getitem__(self, i):
		lf = self.b[i]['offset']
		rt = self.b[i]['length']+lf
		return self.a[lf:rt]
же. Аналогично для имён файлов можно, например через getattr, ну или в гетитем проверять строка или число. https://www.geeksforgeeks.org/__getitem__-in-python/ https://medium.com/@satishgoda/python-attribute-access-using-getattr-and-geta...

Красивей, наверное, на старте прочитать все заголовки через struct и заmmapать в self.словарь все смещения по файлу, и к нему уже обращаться, тем более что у вас в файлах бинарные данные.

thunar ★★★★★ ()
Последнее исправление: thunar (всего исправлений: 9)