I propose to add two function to multiarray module in Numeric:
tofile(array, openedfile) array = fromfile(opendfile, dimension, typecode = "l")
Now I use these functions in my module. Here is an implementation from module:
###############################################################################3
#include "Python.h" #define PY_ARRAY_UNIQUE_SYMBOL PyArray_arrayfile #include "Numeric/arrayobject.h"
#define MAX_DIMS 40
static PyObject * PyArray_FromFile(PyObject *self, PyObject *args) { PyObject *f, *dimobj, *temp; PyArray_Descr *descr; PyArrayObject *ret = NULL; int i, n, dim[40], nt; char *typecode = "l"; FILE *fp; int type_num, N = 1; size_t nread;
if (!PyArg_ParseTuple(args, "O!O!|s#:fromfile", \ &PyFile_Type, &f, &PyTuple_Type, &dimobj, &typecode, &nt)) return NULL;
fp = PyFile_AsFile(f); if (fp == NULL) { PyErr_SetString(PyExc_TypeError, "1st argument must be open file"); return NULL; } n = PyTuple_Size(dimobj); if (n > MAX_DIMS) { PyErr_SetString(PyExc_TypeError, "dimension is too large"); return NULL; } if (n > 0) { for (i = 0; i < n; i++) { temp = PyTuple_GetItem(dimobj, i); dim[i] = (int)PyInt_AsLong(temp); }
descr = PyArray_DescrFromType(*typecode); type_num = descr -> type_num;
ret = (PyArrayObject *)PyArray_FromDims(n, dim, type_num); memcpy(ret->data, descr->zero, N*descr->elsize);
N = 1; for (i = 0; i < n; i++) N *= dim[i]; nread = fread((char *)ret->data, descr->elsize, N, fp); if (nread < (size_t)N) { PyErr_SetString(PyExc_EOFError, "not enough items in file"); return NULL; } }
return (PyObject *)ret; }
static char PyArray_FromFile_doc [] = "fromfile(f, dimension, typecode = 'l')\n\ \n\ Create array from open file f with given dimension and typecode.\n\ Note, that file must be open in binary mode.";
static PyObject * PyArray_ToFile(PyObject *self, PyObject *args) { PyObject *f; PyArrayObject *A; int N; FILE *fp;
if (!PyArg_ParseTuple(args, "O!O!:tofile", &PyArray_Type, &A, &PyFile_Type, &f)) return NULL;
fp = PyFile_AsFile(f); if (fp == NULL) { PyErr_SetString(PyExc_TypeError, "arg must be open file"); return NULL; }
N = PyArray_SIZE(A); if (N > 0) { if (fwrite(A->data, A->descr->elsize, N, fp) != (size_t)N) { PyErr_SetFromErrno(PyExc_IOError); clearerr(fp); return NULL; } } Py_INCREF(Py_None); return Py_None; }
static char PyArray_ToFile_doc [] = "tofile(array, f)\n\ \n\ Write array to file open f.\n\ Note, that file must be open in binary mode.";
static PyMethodDef arrayfile_module_methods[] = { {"fromfile", PyArray_FromFile, 1, PyArray_FromFile_doc}, {"tofile", PyArray_ToFile, 1, PyArray_ToFile_doc}, {NULL, NULL} /* sentinel */ };
############################################################################
Zaur Shibzoukhov