[Numpy-svn] r4856 - in trunk/numpy/core: . tests

numpy-svn at scipy.org numpy-svn at scipy.org
Mon Mar 10 22:30:17 EDT 2008


Author: stefan
Date: 2008-03-10 21:30:12 -0500 (Mon, 10 Mar 2008)
New Revision: 4856

Modified:
   trunk/numpy/core/memmap.py
   trunk/numpy/core/tests/test_memmap.py
Log:
Allow file-like object to be used to create a memmap.
Fix NamedTemporaryFile problem for Windows platforms.


Modified: trunk/numpy/core/memmap.py
===================================================================
--- trunk/numpy/core/memmap.py	2008-03-10 16:56:38 UTC (rev 4855)
+++ trunk/numpy/core/memmap.py	2008-03-11 02:30:12 UTC (rev 4856)
@@ -25,8 +25,9 @@
 
     Parameters
     ----------
-    name : filename
-        The file name to be used as the array data buffer.
+    filename : string or file-like object
+        The file name or file object to be used as the array data
+        buffer.
     dtype : data-type, optional
         The data-type used to interpret the file contents.
         Default is uint8
@@ -138,7 +139,7 @@
     """
 
     __array_priority__ = -100.0
-    def __new__(subtype, name, dtype=uint8, mode='r+', offset=0,
+    def __new__(subtype, filename, dtype=uint8, mode='r+', offset=0,
                 shape=None, order='C'):
         try:
             mode = mode_equivalents[mode]
@@ -147,7 +148,10 @@
                 raise ValueError("mode must be one of %s" % \
                                  (valid_filemodes + mode_equivalents.keys()))
 
-        fid = file(name, (mode == 'c' and 'r' or mode)+'b')
+        if hasattr(filename,'read'):
+            fid = filename
+        else:
+            fid = file(filename, (mode == 'c' and 'r' or mode)+'b')
 
         if (mode == 'w+') and shape is None:
             raise ValueError, "shape must be given"
@@ -194,8 +198,7 @@
         self._offset = offset
         self._mode = mode
         self._size = size
-        self._name = name
-        fid.close()
+        self._name = filename
         return self
 
     def __array_finalize__(self, obj):

Modified: trunk/numpy/core/tests/test_memmap.py
===================================================================
--- trunk/numpy/core/tests/test_memmap.py	2008-03-10 16:56:38 UTC (rev 4855)
+++ trunk/numpy/core/tests/test_memmap.py	2008-03-11 02:30:12 UTC (rev 4856)
@@ -14,18 +14,29 @@
         self.data = arange(12, dtype=self.dtype)
         self.data.resize(self.shape)
 
-    def test_RoundTrip(self):
-        fp = memmap(self.tmpfp.name, dtype=self.dtype, mode='w+',
+    def test_roundtrip(self):
+        # Write data to file
+        fp = memmap(self.tmpfp, dtype=self.dtype, mode='w+',
                     shape=self.shape)
         fp[:] = self.data[:]
-        del fp
-        newfp = memmap(self.tmpfp.name, dtype=self.dtype, mode='r',
+        del fp # Test __del__ machinery, which handles cleanup
+
+        # Read data back from file
+        newfp = memmap(self.tmpfp, dtype=self.dtype, mode='r',
                        shape=self.shape)
         assert allclose(self.data, newfp)
         assert_array_equal(self.data, newfp)
 
+    def test_open_with_filename(self):
+        fp = memmap(self.tmpfp, dtype=self.dtype, mode='w+',
+                       shape=self.shape)
+        fp[:] = self.data[:]
+
+        memmap(self.tmpfp.name, dtype=self.dtype, mode='r',
+               shape=self.shape)
+
     def test_flush(self):
-        fp = memmap(self.tmpfp.name, dtype=self.dtype, mode='w+',
+        fp = memmap(self.tmpfp, dtype=self.dtype, mode='w+',
                     shape=self.shape)
         fp[:] = self.data[:]
         fp.flush()




More information about the Numpy-svn mailing list