C では次のようなレコードで構成されるバイナリ ファイルを読み込んでいます。
typedef _rec_t
{
char text[20];
unsigned char index[3];
} rec_t;
これで、これを解析して 23 の個別の値を持つタプルにすることができますnamedtuple
が、最初の 20 バイトを に結合し、text
残りの 3バイトを に結合するために使用できるとよいでしょうindex
。どうすればそれを達成できますか?基本的に、23 個の値の 1 つのタプルの代わりに、それぞれ 20 個と 3 個の値の 2 つのタプルを持ち、「自然な名前」を使用してこれらにアクセスすることをお勧めします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()