Есть ли элегантный способ использовать struct и namedtuple вместо этого?

Я читаю двоичный файл, состоящий из записей, которые в 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()
5
задан 0xC0000022L 12 July 2012 в 22:17
поделиться