tarfile's tar.extractfile() file-like object incompatible with pickle.load()?
Matt Doucleff
mattduke at ugcs.caltech.edu
Fri Aug 27 14:00:44 EDT 2004
"Tom B." <sbabbitt at commspeed.net> wrote in message news:<1093572564.733113 at news.commspeed.net>...
> "Matt Doucleff" <mattduke at ugcs.caltech.edu> wrote in message
> news:3e6d6c21.0408261043.264c3a2d at posting.google.com...
> > Hi everyone! I must be doing something wrong here :) I have a
> > tarball that contains a single file whose contents are a pickled
> > object. I would like to unpickle the object directly from the tarball
> > using the file-like object provided by extractfile(). Attempts to do
> > this result in EOFError. However if I first extract to a temporary
> > file, then unpickle from there, it works. The below code reproduces
> > the problem (on my machine at least). I'm running Python 2.3.4,
> > manually installed on Debian Woody (original python removed). Thanks!
> >
> > This sample code creates (and then removes) files in the tmp directory
> > and in the current working directory.
> >
> > # demonstrates extractfile/unpickle failure (bug?)
> >
> > # pickle a dict to a temp file
> > # create tar file, add temp file to it, close tar file
> > # open tar file for reading
> > # obtain file-like object for pickled file using extractfile()
> > # attempt to unpickle dict from file-like object
> > # fails with EOFError exception
> >
> > import tarfile
> > import pickle
> > import tempfile
> > import os
> >
> > if __name__ == '__main__':
> > try:
> > hashtopickle = { 'a' : 1, 'b' : 2 }
> >
> > # pickle to temp file
> > (fd, tmpfilename) = tempfile.mkstemp()
> > tmpfile = os.fdopen(fd, 'w')
> > pickle.dump(hashtopickle, tmpfile)
> > tmpfile.close()
> >
> > # create tar; add temp file
> > tar = tarfile.open('tarpickle.tar', 'w')
> > tar.add(tmpfilename, 'pickledhash')
> > tar.close()
> >
> > # remove temp file
> > os.remove(tmpfilename)
> >
> > # open tarfile for reading, get filelike
> > tar = tarfile.open('tarpickle.tar', 'r')
> > filelike = tar.extractfile('pickledhash')
> >
> > # fails
> > hashcopy = pickle.load(filelike)
> >
> > finally:
> > # cleanup
> > os.remove('tarpickle.tar')
>
> It occurs to me that you need to do,
>
> hashcopy = pickle.loads(filelike)
>
> if filelike is a string.
>
> Tom
> P.S. have a look at pickle.dumps()
The tarfile.extractfile() method does not read the contents
of the encapsulated file into a string, but constructs a new
object that implements file operations (it is like a file)
and is intended to be used as if you had simply opened the
tar-encapsulated file directly.
Matt
More information about the Python-list
mailing list