def fort_read(self,fmt,dtype=None): """Read a Fortran binary record. Inputs: fmt -- If dtype is not given this represents a struct.pack format string to interpret the next record. Otherwise this argument is ignored. dtype -- If dtype is not None, then read in the next record as an array of type dtype. Outputs: (data,) data -- If dtype is None, then data is a tuple containing the output of struct.unpack on the next Fortan record. If dtype is a datatype string, then the next record is read in as a 1-D array of type datatype. """ lookup_dict = {'ieee-le':"<",'ieee-be':">",'native':''} if dtype is None: fmt = lookup_dict[self.format] + fmt numbytes = struct.calcsize(fmt) nn = struct.calcsize("i"); if (self.raw_read(nn) == ''): raise ValueError, "Unexpected end of file..." strdata = self.raw_read(numbytes) if strdata == '': raise ValueError, "Unexpected end of file..." data = struct.unpack(fmt,strdata) if (self.raw_read(nn) == ''): raise ValueError, "Unexpected end of file..." return data else: # Ignore format string and read in next record as an array. fmt = lookup_dict[self.format] + "i" nn = struct.calcsize(fmt) nbytestr = self.raw_read(nn) if nbytestr == '': raise ValueError, "Unexpected end of file..." nbytes = struct.unpack(fmt,nbytestr)[0] howmany, dtype = getsize_type(dtype) ncount = nbytes / howmany if ncount*howmany != nbytes: self.rewind(4) raise ValueError, "A mismatch between the type requested and the data stored." if ncount < 0: raise ValueError, "Negative number of bytes to read:\n file is probably not opened with correct endian-ness." if ncount == 0: raise ValueError, "End of file? Zero-bytes to read." retval = numpyio.fread(self.file, ncount, dtype, dtype, self.bs) if len(retval) == 1: retval = retval[0] if (self.raw_read(nn) == ''): raise ValueError, "Unexpected end of file..." return retval
def fort_read(self, fmt, dtype=None): """Read a Fortran binary record. Inputs: fmt -- If dtype is not given this represents a struct.pack format string to interpret the next record. Otherwise this argument is ignored. dtype -- If dtype is not None, then read in the next record as an array of type dtype. Outputs: (data,) data -- If dtype is None, then data is a tuple containing the output of struct.unpack on the next Fortan record. If dtype is a datatype string, then the next record is read in as a 1-D array of type datatype. """ lookup_dict = {'ieee-le': "<", 'ieee-be': ">", 'native': ''} if dtype is None: fmt = lookup_dict[self.format] + fmt numbytes = struct.calcsize(fmt) nn = struct.calcsize("i") if (self.raw_read(nn) == ''): raise ValueError, "Unexpected end of file..." strdata = self.raw_read(numbytes) if strdata == '': raise ValueError, "Unexpected end of file..." data = struct.unpack(fmt, strdata) if (self.raw_read(nn) == ''): raise ValueError, "Unexpected end of file..." return data else: # Ignore format string and read in next record as an array. fmt = lookup_dict[self.format] + "i" nn = struct.calcsize(fmt) nbytestr = self.raw_read(nn) if nbytestr == '': raise ValueError, "Unexpected end of file..." nbytes = struct.unpack(fmt, nbytestr)[0] howmany, dtype = getsize_type(dtype) ncount = nbytes / howmany if ncount * howmany != nbytes: self.rewind(4) raise ValueError, "A mismatch between the type requested and the data stored." if ncount < 0: raise ValueError, "Negative number of bytes to read:\n file is probably not opened with correct endian-ness." if ncount == 0: raise ValueError, "End of file? Zero-bytes to read." retval = numpyio.fread(self.file, ncount, dtype, dtype, self.bs) if len(retval) == 1: retval = retval[0] if (self.raw_read(nn) == ''): raise ValueError, "Unexpected end of file..." return retval
def read(self,count,stype,rtype=None,bs=None,c_is_b=0): """Read data from file and return it in a numpy array. Inputs: count -- an integer specifying the number of elements of type stype to read or a tuple indicating the shape of the output array. stype -- The data type of the stored data (see fwrite method). rtype -- The type of the output array. Same as stype if None. bs -- Whether or not to byteswap (or use self.bs if None) c_is_b --- If non-zero then the count is an integer specifying the total number of bytes to read (must be a multiple of the size of stype). Outputs: (output,) output -- a numpy array of type rtype. """ if bs is None: bs = self.bs else: bs = (bs == 1) howmany,stype = getsize_type(stype) shape = None if c_is_b: if count % howmany != 0: raise ValueError, "When c_is_b is non-zero then " \ "count is bytes\nand must be multiple of basic size." count = count / howmany elif type(count) in [types.TupleType, types.ListType]: shape = list(count) # allow -1 to specify unknown dimension size as in reshape minus_ones = shape.count(-1) if minus_ones == 0: count = product(shape,axis=0) elif minus_ones == 1: now = self.tell() self.seek(0,2) end = self.tell() self.seek(now) remaining_bytes = end - now know_dimensions_size = -product(count,axis=0) * getsize_type(stype)[0] unknown_dimension_size, illegal = divmod(remaining_bytes, know_dimensions_size) if illegal: raise ValueError("unknown dimension doesn't match filesize") shape[shape.index(-1)] = unknown_dimension_size count = product(shape,axis=0) else: raise ValueError( "illegal count; can only specify one unknown dimension") shape = tuple(shape) if rtype is None: rtype = stype else: howmany,rtype = getsize_type(rtype) if count == 0: return zeros(0,rtype) retval = numpyio.fread(self.file, count, stype, rtype, bs) if shape is not None: retval = resize(retval, shape) return retval
from numpyio import fread, fwrite from sys import argv print "\nReading info from %s.hdr and" % argv[1] print "%s.dat\n" % argv[1] print "Writing %s.raw\n" % argv[1] HEADERLEN = 640 BLOCKLEN = 49152 # Read the header file file = open(argv[1]+'.hdr', 'r') data = fread(file, HEADERLEN+8, 'b') file.close() header = data[4:-4] infile = open(argv[1]+'.dat', 'r') outfile = open(argv[1]+'.raw', 'w') # Read and write the raw data while (1): data = fread(infile, BLOCKLEN+8, 'b') if (len(data)==BLOCKLEN+8): fwrite(outfile, HEADERLEN, header, 'b') fwrite(outfile, BLOCKLEN, data[4:-4], 'b') else: break print '' infile.close() outfile.close()
from __future__ import print_function from numpyio import fread, fwrite from sys import argv print("\nReading info from %s.hdr and" % argv[1]) print("%s.dat\n" % argv[1]) print("Writing %s.raw\n" % argv[1]) HEADERLEN = 640 BLOCKLEN = 49152 # Read the header file file = open(argv[1] + '.hdr', 'r') data = fread(file, HEADERLEN + 8, 'b') file.close() header = data[4:-4] infile = open(argv[1] + '.dat', 'r') outfile = open(argv[1] + '.raw', 'w') # Read and write the raw data while (1): data = fread(infile, BLOCKLEN + 8, 'b') if (len(data) == BLOCKLEN + 8): fwrite(outfile, HEADERLEN, header, 'b') fwrite(outfile, BLOCKLEN, data[4:-4], 'b') else: break print('') infile.close()
def read(self, count, stype, rtype=None, bs=None, c_is_b=0): """Read data from file and return it in a numpy array. Inputs: count -- an integer specifying the number of elements of type stype to read or a tuple indicating the shape of the output array. stype -- The data type of the stored data (see fwrite method). rtype -- The type of the output array. Same as stype if None. bs -- Whether or not to byteswap (or use self.bs if None) c_is_b --- If non-zero then the count is an integer specifying the total number of bytes to read (must be a multiple of the size of stype). Outputs: (output,) output -- a numpy array of type rtype. """ if bs is None: bs = self.bs else: bs = (bs == 1) howmany, stype = getsize_type(stype) shape = None if c_is_b: if count % howmany != 0: raise ValueError, "When c_is_b is non-zero then " \ "count is bytes\nand must be multiple of basic size." count = count / howmany elif type(count) in [types.TupleType, types.ListType]: shape = list(count) # allow -1 to specify unknown dimension size as in reshape minus_ones = shape.count(-1) if minus_ones == 0: count = product(shape, axis=0) elif minus_ones == 1: now = self.tell() self.seek(0, 2) end = self.tell() self.seek(now) remaining_bytes = end - now know_dimensions_size = -product( count, axis=0) * getsize_type(stype)[0] unknown_dimension_size, illegal = divmod( remaining_bytes, know_dimensions_size) if illegal: raise ValueError( "unknown dimension doesn't match filesize") shape[shape.index(-1)] = unknown_dimension_size count = product(shape, axis=0) else: raise ValueError( "illegal count; can only specify one unknown dimension") shape = tuple(shape) if rtype is None: rtype = stype else: howmany, rtype = getsize_type(rtype) if count == 0: return zeros(0, rtype) retval = numpyio.fread(self.file, count, stype, rtype, bs) if shape is not None: retval = resize(retval, shape) return retval