Could zipfile module process the zip data in memory?

John Machin sjmachin at lexicon.net
Sun Apr 29 08:34:08 EDT 2007


On Apr 29, 10:14 pm, "Daniel Nogradi" <nogr... at gmail.com> wrote:
> > > > I made a C/S network program, the client receive the zip file from the
> > > > server, and read the data into a variable. how could I process the
> > > > zipfile directly without saving it into file.
> > > > In the document of the zipfile module, I note that it mentions the
> > > > file-like object? what does it mean?
>
> > > > class ZipFile( file[, mode[, compression[, allowZip64]]])
> > > >          Open a ZIP file, where file can be either a path to a file (a
> > > > string) or a file-like object.
>
> > > Yes it is possible to process the content of the zipfile without
> > > saving every file:
>
> > > [untested]
>
> > >         from zipfile import ZipFile
> > >         from StringIO import StringIO
>
> > >         zipp = ZipFile( this_is_the_zip_file_from_your_server, 'r' )
> > >         for name in zipp.namelist( ):
> > >                 content = zipp.read( name )
> > >                 s = StringIO( )
> > >                 s.write( content )
> > >                 # now the file 'name' is in 's' (in memory)
> > >                 # you can process it further
> > >                 # ............
> > >                 s.close( )
> > >         zipp.close( )
>
> > > HTH,
> > > Daniel
> > Thanks!
> > Maybe my poor english makes you confusion:-). The client receive the
> > zip file data from the server, and keep these data as a variable, not
> > as a file in harddisk. such as "zipFileData", but the first argument
> > of the "ZipFile" is filename. I would like to let the ZipFile() open
> > the file from "zipFileData" directly but not file in harddisk
>
> > zipp = ZipFile( this_is_the_zip_file_from_your_server, 'r' )
> >                               ^ I don't have this file, all its data
> > is in a variable.
>
> Well, as you correctly pointed out in your original post ZipFile can
> receive a filename or a file-like object. If the zip archive data is
> in zipFileData then you might do:
>
> from StringIO import StringIO
> from zipfile import ZipFile
>
> data = StringIO( )
> data.write( zipFileData )
> data.close( )

Even if that worked, it would be a long-winded way to do it. Please
contemplate the docs:

"""getvalue( )

Retrieve the entire contents of the ``file'' at any time before the
StringIO object's close() method is called.[snip note re mixing str &
unicode]

close( )

Free the memory buffer. """

The short working way is: """class StringIO( [buffer])

When a StringIO object is created, it can be initialized to an
existing string by passing the string to the constructor."""





More information about the Python-list mailing list