How do you read/write a
binary file into/from a Numeric
array?
Advertisement: In 2012, I published the book A Hands-On Introduction to Using Python in the Atmospheric and Oceanic Sciences. If you're new to Python, you may find it useful!
Since Python will read the binary file as just a stream of
bytes, without any conversion into numeric types nor formatting
into an array, the trick here is to use the read
method in the array
module to read and format
the byte stream into the type and shape desired.
Say we have a raw binary file (i.e. without the prefix word Fortran
unformatted appends to each logical record).
This file tmp.bin contains
single-precision (4-byte) floating point values on
a latitude-longitude array.
Each row is one latitude band,
and there are 73 such bands at 144 longitude points;
thus, the array is dimensioned 73 x 144.
Adjacent longitudes, along the same latitude band, are
contiguous in the file.
We want to read the data from the file into
a Numeric
array data
.
import Numeric as N import array num_lon = 144 num_lat = 73 tmpfile = "tmp.bin" fileobj = open(tmpfile, mode='rb') binvalues = array.array('f') binvalues.read(fileobj, num_lon * num_lat) data = N.array(binvalues, typecode=N.Float)
data = N.reshape(data, (num_lat, num_lon))
fileobj.close()
The mode
flag opens the file for read-only access
and tells Python it's a binary file (and not text).
The binvalues
object
is set as single-precision floating point
(type code 'f'), and 10512 (= 144 x 73) values are
read into it. We then convert the values
to the Numeric
array
format and shape the values into the 73 x 144 grid.
To write out a Numeric
array to a binary file,
first convert the flat
representation of the
Numeric
array into an array
array, then
use the tofile
method in the array
package to write the array out to a file.
Say we have a single-precision floating point
Numeric
array data
and we want to write it out to a file tmp.bin,
the steps then would be:
import array tmpfile = "tmp.bin" fileobj = open(tmpfile, mode='wb') outvalues = array.array('f') outvalues.fromlist( data.flat.tolist() ) outvalues.tofile(fileobj) fileobj.close()
There isn't a way to convert a Numeric
array
directly into an array
array. Instead we first
convert the Numeric
array into a list
(that's what the data.flat.tolist()
line does)
and then fill the array
array with the fromlist
method.
Note that Python references and stores array elements
slightly differently
than IDL and MATLAB.
Also, in newer (at least post-November 2003)
versions of array
, the read
method is deprecated; use the fromfile
method instead.
Notes: Thanks to Guido van Rossum's posting and Mike Steder for help on this! This discussion applies to Python 2.2.