On 10 Sep, 18:33, Jon Clements <[EMAIL PROTECTED]> wrote: > On 10 Sep, 18:14, Aaron Scott <[EMAIL PROTECTED]> wrote: > > > > > I've been trying to tackle this all morning, and so far I've been > > completely unsuccessful. I have a binary file that I have the > > structure to, and I'd like to read it into Python. It's not a > > particularly complicated file. For instance: > > > signature char[3] "GDE" > > version uint32 2 > > attr_count uint32 > > { > > attr_id uint32 > > attr_val_len uint32 > > attr_val char[attr_val_len] > > > } ... repeated attr_count times ... > > > However, I can't find a way to bring it into Python. This is my code > > -- which I know is definitely wrong, but I had to start somewhere: > > > import struct > > file = open("test.gde", "rb") > > output = file.read(3) > > print output > > version = struct.unpack("I", file.read(4))[0] > > print version > > attr_count = struct.unpack("I", file.read(4))[0] > > while attr_count: > > print "---" > > file.seek(4, 1) > > counter = int(struct.unpack("I", file.read(4))[0]) > > print file.read(counter) > > attr_count -= 1 > > file.close() > > > Of course, this doesn't work at all. It produces: > > > GDE > > 2 > > --- > > é > > --- > > ê Å > > > I'm completely at a loss. If anyone could show me the correct way to > > do this (or at least point me in the right direction), I'd be > > extremely grateful. > > What if we view the data as having an 11 byte header: > signature, version, attr_count = struct.unpack('3cII', > yourfile.read(11)) > > Then for the list of attr's: > for idx in xrange(attr_count): > attr_id, attr_val_len = struct.unpack('II', yourfile.read(8)) > attr_val = yourfile.read(attr_val_len) > > hth, or gives you a pointer anyway > Jon.
CORRECTION: '3cII' should be '3sII'. -- http://mail.python.org/mailman/listinfo/python-list