At Thursday 16/11/2006 10:48, Jim wrote:

I'm trying to read .zip files and drop from the listing those files
that are directories.  I'm using the zipfile module.

Googling has increased my suspicion that
it is not just a matter of seeing if the file name ends in '/' and that
the relevant external file attribute seems to have different values for
people from different platforms, so just experimenting on my platform
doesn't seem to be a safe solution.

Ending in / appears to be enough. Filenames are stored using / in Windows or Linux, using winzip, gzip and winrar at least. Notice that no ordering is implied: directories may come _after_ filenames inside it.
This fragment extracts all ZipFile contents, maintaining directory structure:

--- cut ---
zf = ZipFile(zfname, 'r')
try:
    # creo todos los subdirectorios que existen en el zip
    # (vienen en cualquier orden)
    namelist = list(zf.namelist())
    namelist.sort(key=lambda n:len(n))
    for fn in namelist:
        if fn.endswith('/'):
            fullfn = os.path.join(tmpdir, *fn[:-1].split('/'))
            if not os.path.isdir(fullfn):
                os.makedirs(fullfn)

    # extraigo todos los archivos, respetando sus directorios
    for fn in namelist:
        if fn.endswith('/'):
            continue
        fullfn = os.path.join(tmpdir, *fn.split('/'))
        ofile = open(fullfn, 'wb')
        ofile.write(zf.read(fn))
        ofile.close()
        # mantener fecha/hora
        dt = zf.getinfo(fn).date_time
        ft = time.mktime((dt[0],dt[1],dt[2],dt[3],dt[4],dt[5],0,0,-1))
        os.utime(fullfn, (ft,ft))
finally:
    zf.close()
--- cut ---


--
Gabriel Genellina
Softlab SRL
__________________________________________________
Correo Yahoo!
Espacio para todos tus mensajes, antivirus y antispam ¡gratis! ¡Abrí tu cuenta ya! - http://correo.yahoo.com.ar
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to