我读由记录的二进制文件,在C应该是这样的:有没有一种优雅的方式来使用struct和namedtuple而不是这个?
typedef _rec_t
{
char text[20];
unsigned char index[3];
} rec_t;
现在我能够解析与23个不同值的元组里面,但我们更希望,如果我能使用namedtuple
将前20个字节组合到text
中,并将其余三个字节组合到index
中。我怎样才能做到这一点?基本上而不是23个值的一个元组,我倾向于分别具有两个20和3值的元组,并使用“自然名称”(即通过namedtuple
)访问这些元组。
我目前对struct.unpack_from()
使用格式"20c3B"
。
注意:当我拨打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()
'data = str()'(在'main'中)是不必要的。 – mgilson 2012-07-12 21:57:08
@mgilson:谢谢:) – 0xC0000022L 2012-07-12 22:11:48