3
\$\begingroup\$

I have existing code that handles a tarball and would like to use that to process a directory, so I thought it would be reasonable to pack the directory up in a temporary file. I ended up writing:

class temp_tarball( object ):
    def __init__( self, path ):
        self.tmp = tempfile.NamedTemporaryFile()
        self.tarfile = tarfile.open( None, 'w:', self.tmp )
        self.tarfile.add( path, '.' )
        self.tarfile.close()
        self.tmp.flush()
        self.tarfile = tarfile.open( self.tmp.name, 'r:' )
    def __del__( self ):
        self.tarfile.close()
        self.tmp.close()

I am looking for a cleaner way to reopen the tarfile with mode 'r'.

\$\endgroup\$
  • \$\begingroup\$ What's your concern with it now? \$\endgroup\$ – Winston Ewert Feb 1 '12 at 15:47
  • \$\begingroup\$ @winston I don't like using the NamedTemporaryFile, and would prefer to use tempfile.TemporaryFile. I don't really have a specific complaint; it just smells a bit funny as it is. \$\endgroup\$ – William Pursell Feb 1 '12 at 16:21
2
\$\begingroup\$

You could try:

def __init__(self, path):
    self.tmp = tempfile.TemporaryFile()
    self.tarfile = tarfile.open( fileobj=self.tmp, mode='w:' )
    self.tarfile.add( path, '.' )
    self.tarfile.close()
    self.tmp.flush()
    self.tmp.seek(0)
    self.tarfile = tarfile.open( fileobj=self.tmp, mode='r:' )

tarfile() will take a fileobj in the constructor instead of a name, so as long as you don't close it, and instead just seek() to 0 when you want to re-read it, you should be good.

| improve this answer | |
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.