Я читаю двоичный файл, состоящий из записей, которые в C выглядели бы так:
typedef _rec_t
{
char text[20];
unsigned char index[3];
} rec_t;
Теперь я могу разобрать это в кортеж с 23 различными значениями, но предпочел бы, чтобы я мог использовать namedtuple
для объединения первых 20 байтов в text
и трех оставшихся байтов в index
. Как я могу этого добиться? По сути, вместо одного кортежа из 23 значений я бы предпочел иметь два кортежа из 20 и 3 значений соответственно и обращаться к ним с использованием «естественного имени», то есть с помощью namedtuple
.
В настоящее время я использую формат "20c3B"
для struct.unpack_from()
.
Примечание. :При вызове parse_text
в строке много последовательных записей.
Мой код (урезан до соответствующих частей):
#!/usr/bin/env python
import sys
import os
import struct
from collections import namedtuple
def parse_text(data):
fmt = "20c3B"
l = len(data)
sz = struct.calcsize(fmt)
num = l/sz
if not num:
print "ERROR: no records found."
return
print "Size of record %d - number %d" % (sz, num)
#rec = namedtuple('rec', 'text index')
empty = struct.unpack_from(fmt, data)
# Loop through elements
#...
def main():
if len(sys.argv) < 2:
print "ERROR: need to give file with texts as argument."
sys.exit(1)
s = os.path.getsize(sys.argv[1])
f = open(sys.argv[1])
try:
data = f.read(s)
parse_text(data)
finally:
f.close()
if __name__ == "__main__":
main()