awips2/pythonPackages/scientific/Scientific/IO/ArrayIO.py
root 06a8b51d6d Initial revision of AWIPS2 11.9.0-7p5
Former-commit-id: 64fa9254b946eae7e61bbc3f513b7c3696c4f54f
2012-01-06 08:55:05 -06:00

148 lines
4.5 KiB
Python
Executable file

# Array I/O to text files
#
# Written by Konrad Hinsen <hinsen@cnrs-orleans.fr>
# last revision: 2006-6-23
#
"""
Basic support for I/O of one- and two-dimensional numerical arrays to and from plain text files
The text file format is very simple and used by many other programs as
well:
- each line corresponds to one row of the array
- the numbers within a line are separated by white space
- lines starting with # are ignored (comment lines)
An array containing only one line or one column is returned as a
one-dimensional array on reading. One-dimensional arrays are written
as one item per line.
Numbers in files to be read must conform to Python/C syntax. For
reading files containing Fortran-style double-precision numbers
(exponent prefixed by D), use the module L{Scientific.IO.FortranFormat}.
"""
from Scientific.IO.TextFile import TextFile
from Scientific import N; Numeric = N
import string
def readArray(filename):
"""
Read array data from a file
This function works for arbitrary data types (every array element can be
given by an arbitrary Python expression), but at the price of being
slow. For large arrays, use L{readFloatArray} or L{readIntegerArray}
if possible.
@param filename: the name of the file to read
@type filename: C{str}
@returns: an array containing the data from the file
@rtype: C{Numeric.array}
"""
data = []
for line in TextFile(filename):
if len(line) == 0 and len(data) > 0:
break
if line[0] != '#':
data.append(map(eval, string.split(line)))
a = Numeric.array(data)
if a.shape[0] == 1 or a.shape[1] == 1:
a = Numeric.ravel(a)
return a
def readFloatArray(filename):
"""
Read array data from a file into an array of floats
@param filename: the name of the file to read
@type filename: C{str}
@returns: an array containing the data from the file
@rtype: C{Numeric.array} of C{float}
"""
data = []
for line in TextFile(filename):
if line[0] != '#':
data.append(map(string.atof, string.split(line)))
a = Numeric.array(data)
if a.shape[0] == 1 or a.shape[1] == 1:
a = Numeric.ravel(a)
return a
def readIntegerArray(filename):
"""
Read array data from a file into an array of integers
@param filename: the name of the file to read
@type filename: C{str}
@returns: an array containing the data from the file
@rtype: C{Numeric.array} of C{int}
"""
data = []
for line in TextFile(filename):
if line[0] != '#':
data.append(map(string.atoi, string.split(line)))
a = Numeric.array(data)
if a.shape[0] == 1 or a.shape[1] == 1:
a = Numeric.ravel(a)
return a
def writeArray(array, filename, mode='w'):
"""
Write a text representation of an array to a file.
@param array: the array to be written
@type array: C{Numeric.array}
@param filename: the name of the output file
@type filename: C{str}
@param mode: the file access mode, 'w' (new file) or 'a' (append)
@type mode: C{str}
"""
file = TextFile(filename, mode)
if len(array.shape) == 1:
array = array[:, Numeric.NewAxis]
for line in array:
for element in line:
file.write(`element` + ' ')
file.write('\n')
file.close()
#
# Write several data sets (one point per line) to a text file,
# with a separator line between data sets. This is sufficient
# to make input files for most plotting programs.
#
def writeDataSets(datasets, filename, separator = ''):
"""
Write multiple datasets to a text file.
@param datasets: a sequence of datasets describing a curve to be
plotted. Each dataset is either a 1d-array
(list of values) or a 2d-array of shape N x 2
(list of (x, y) pairs). Nested lists can be used
instead of arrays.
@param filename: the name of the output file
@type filename: C{str}
@param separator: the contents of the line that is written between
two datasets
@type separator: C{str}
"""
file = TextFile(filename, 'w')
nsets = len(datasets)
for i in range(nsets):
d = Numeric.array(list(datasets[i]))
if len(d.shape) == 1:
d = d[:, Numeric.NewAxis]
for point in d:
for number in point:
file.write(`number` + ' ')
file.write('\n')
if (i < nsets-1):
file.write(separator + '\n')
file.close()