diff --git a/iofmt/fortbin.py b/iofmt/fortbin.py index 2887737..a8bdbb1 100644 --- a/iofmt/fortbin.py +++ b/iofmt/fortbin.py @@ -1,4 +1,4 @@ -# $Id: fortbin.py,v 1.2 2010-02-19 18:39:17 wirawan Exp $ +# $Id: fortbin.py,v 1.3 2010-05-28 18:43:14 wirawan Exp $ # # wpylib.iofmt.fortbin module # Created: 20100208 @@ -15,7 +15,7 @@ import sys from wpylib.sugar import ifelse class fortran_bin_file(object): - """A tool for reading Fortran binary files. + """A tool for reading and writing Fortran binary files. Caveat: On 64-bit systems, typical Fortran implementations still have int==int32 (i.e. the LP64 programming model), unless "-i8" kind of option is enabled. @@ -34,10 +34,18 @@ class fortran_bin_file(object): def open(self, filename, mode="r"): self.F = open(filename, mode+"b") + def close(self): + if getattr(self, "F", None): + self.F.close() + self.F = None + def read(self, *fields, **opts): """Reads a Fortran record. The description of the fields are given as - (name, dtype, length) tuples.""" + either (name, dtype) or (name, dtype, length) tuples. + If length is not specified, then a scalar value is read. + Length is a scalar for 1-D array, or a tuple or list for multidimensional + array.""" from numpy import fromfile as rd if self.debug or opts.get("debug"): dbg = lambda msg : sys.stderr.write(msg) @@ -62,9 +70,7 @@ class fortran_bin_file(object): "Attempting to read %d bytes from a record of length %d bytes" \ % (expected_len, reclen) - if "out" in opts: - rslt = opts["out"] - elif "dest" in opts: + if "dest" in opts: rslt = opts["dest"] else: rslt = {} @@ -108,7 +114,7 @@ class fortran_bin_file(object): return rslt - def writevals(self, *vals, **opts): + def write_vals(self, *vals, **opts): """Writes a Fortran record. Only values need to be given, because the types are known. This is a direct converse of read subroutine.""" @@ -159,7 +165,7 @@ class fortran_bin_file(object): reclen.tofile(self.F) - def writefields(self, src, *fields, **opts): + def write_fields(self, src, *fields, **opts): if (issubclass(src.__class__, dict) and issubclass(dict, src.__class__)) \ or "__getitem__" in dir(src): def getval(d, k): @@ -189,6 +195,9 @@ class fortran_bin_file(object): else: raise ValueError, "Invalid field type: %s" % str(type(f)) + self.write_vals(*vals, **opts) + + def array_major_dim(arr): """Tests whether a numpy array is column or row major. It will return the following: