Difference between tempfile and spooled tempfile?
Steve Howell
showell30 at yahoo.com
Thu Apr 5 13:42:52 EDT 2012
On Apr 5, 8:10 am, Steve Howell <showel... at yahoo.com> wrote:
> On Apr 5, 7:50 am, "Alex van der Spek" <zd... at 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
More information about the Python-list
mailing list