Extract files from zip file and retain mod date?

前端 未结 4 1364
迷失自我
迷失自我 2020-12-05 14:48

I\'m trying to extract files from a zip file using Python 2.7.1 (on Windows, fyi) and each of my attempts shows extracted files with Modified Date = time of extraction (whic

4条回答
  •  一整个雨季
    2020-12-05 15:16

    Based on Ber's answer, I have developed this version (using Python 2.7.11), which also accounts for directory mod dates.

    from os import path, utime
    from sys import exit
    from time import mktime
    from zipfile import ZipFile
    
    def unzip(zipfile, outDirectory):
        dirs = {}
    
        with ZipFile(zipfile, 'r') as z:
            for f in z.infolist():
                name, date_time = f.filename, f.date_time
                name = path.join(outDirectory, name)
                z.extract(f, outDirectory)
    
                # still need to adjust the dt o/w item will have the current dt
                date_time = mktime(f.date_time + (0, 0, -1))
    
                if (path.isdir(name)):
                    # changes to dir dt will have no effect right now since files are
                    # being created inside of it; hold the dt and apply it later
                    dirs[name] = date_time
                else:
                    utime(name, (date_time, date_time))
    
        # done creating files, now update dir dt
        for name in dirs:
           date_time = dirs[name]
           utime(name, (date_time, date_time))
    
    if __name__ == "__main__":
    
        unzip('archive.zip', 'out')
    
        exit(0)
    

    Since directories are being modified as the extracted files are being created inside them, there appears to be no point in setting their dates with os.utime until after the extraction has completed, so this version caches the directory names and their timestamps till the very end.

提交回复
热议问题