Difference between tempfile and spooled tempfile?

2012-04-05 Thread Alex van der Spek

I do not understand why the spooled write gives an error. See below.
The normal tempfile works just fine. They are supposed to behave equal?

All insight you can provide is welcome.
Alex van der Spek

+


Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)] 
on win32

Type copyright, credits or license() for more information.

import array
import tempfile
stf = tempfile.SpooledTemporaryFile(max_size=1024)
ptf = tempfile.TemporaryFile()
fff = [float(x) for x in range(2048)]
ffa = array.array('f',fff)
ptf.write(ffa)
stf.write(ffa)


Traceback (most recent call last):
 File pyshell#7, line 1, in module
   stf.write(ffa)
 File C:\Python27\lib\tempfile.py, line 595, in write
   rv = file.write(s)
TypeError: must be string or read-only character buffer, not array.array



--
http://mail.python.org/mailman/listinfo/python-list


Re: Difference between tempfile and spooled tempfile?

2012-04-05 Thread Steve Howell
On Apr 5, 7:50 am, Alex van der Spek zd...@xs4all.nl wrote:
 I do not understand why the spooled write gives an error. See below.
 The normal tempfile works just fine. They are supposed to behave equal?

 All insight you can provide is welcome.
 Alex van der Spek

 +

 Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)]
 on win32
 Type copyright, credits or license() for more information.

  import array
  import tempfile
  stf = tempfile.SpooledTemporaryFile(max_size=1024)
  ptf = tempfile.TemporaryFile()
  fff = [float(x) for x in range(2048)]
  ffa = array.array('f',fff)
  ptf.write(ffa)
  stf.write(ffa)

 Traceback (most recent call last):
   File pyshell#7, line 1, in module
     stf.write(ffa)
   File C:\Python27\lib\tempfile.py, line 595, in write
     rv = file.write(s)
 TypeError: must be string or read-only character buffer, not array.array


I think the docs are slightly misleading.  While SpooledTemporaryFile
allows you to write(), it's more finicky about serializing arrays,
hence the error message.

If you look under the hood, you'll see that it's mostly a limitation
of StringIO.

http://hg.python.org/cpython/file/2.7/Lib/tempfile.py

   494 Temporary file wrapper, specialized to switch from
   495 StringIO to a real file when it exceeds a certain size or
   496 when a fileno is needed.
   497 
   498 _rolled = False
   499
   500 def __init__(self, max_size=0, mode='w+b', bufsize=-1,
   501  suffix=, prefix=template, dir=None):
   502 self._file = _StringIO()
   503 self._max_size = max_size
   504 self._rolled = False
   505 self._TemporaryFileArgs = (mode, bufsize, suffix,
prefix, dir)

(See line 502.)

   600 def write(self, s):
   601 file = self._file
   602 rv = file.write(s)
   603 self._check(file)
   604 return rv

(See line 602.)

I'm looking at a slightly different version of the module than you,
but hopefully you get the idea.


-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Difference between tempfile and spooled tempfile?

2012-04-05 Thread Steve Howell
On Apr 5, 8:10 am, Steve Howell showel...@yahoo.com wrote:
 On Apr 5, 7:50 am, Alex van der Spek zd...@xs4all.nl wrote:









  I do not understand why the spooled write gives an error. See below.
  The normal tempfile works just fine. They are supposed to behave equal?

  All insight you can provide is welcome.
  Alex van der Spek

  +

  Python 2.7.1 (r271:86832, Nov 27 2010, 18:30:46) [MSC v.1500 32 bit (Intel)]
  on win32
  Type copyright, credits or license() for more information.

   import array
   import tempfile
   stf = tempfile.SpooledTemporaryFile(max_size=1024)
   ptf = tempfile.TemporaryFile()
   fff = [float(x) for x in range(2048)]
   ffa = array.array('f',fff)
   ptf.write(ffa)
   stf.write(ffa)

  Traceback (most recent call last):
    File pyshell#7, line 1, in module
      stf.write(ffa)
    File C:\Python27\lib\tempfile.py, line 595, in write
      rv = file.write(s)
  TypeError: must be string or read-only character buffer, not array.array

 I think the docs are slightly misleading.  While SpooledTemporaryFile
 allows you to write(), it's more finicky about serializing arrays,
 hence the error message.

 If you look under the hood, you'll see that it's mostly a limitation
 of StringIO.

 http://hg.python.org/cpython/file/2.7/Lib/tempfile.py

    494     Temporary file wrapper, specialized to switch from
    495     StringIO to a real file when it exceeds a certain size or
    496     when a fileno is needed.
    497     
    498     _rolled = False
    499
    500     def __init__(self, max_size=0, mode='w+b', bufsize=-1,
    501                  suffix=, prefix=template, dir=None):
    502         self._file = _StringIO()
    503         self._max_size = max_size
    504         self._rolled = False
    505         self._TemporaryFileArgs = (mode, bufsize, suffix,
 prefix, dir)

 (See line 502.)

    600     def write(self, s):
    601         file = self._file
    602         rv = file.write(s)
    603         self._check(file)
    604         return rv

 (See line 602.)

 I'm looking at a slightly different version of the module than you,
 but hopefully you get the idea.

P.S. The problems the OP is encountering may be a side effect of this
bug:

http://bugs.python.org/issue1730114
-- 
http://mail.python.org/mailman/listinfo/python-list