我正在读取由 C 中的记录组成的二进制文件,如下所示:
typedef _rec_t
{
char text[20];
unsigned char index[3];
} rec_t;
现在我可以将其解析为具有 23 个不同值的元组,但如果我可以使用namedtuple
将前 20 个text
字节组合到index
. 我怎样才能做到这一点?基本上,我宁愿分别拥有两个 20 和 3 个值的元组,而不是一个 23 个值的元组,并使用“自然名称”访问它们,即通过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()