2012-03-21 41 views
8

我試圖從使用Python 2.7.1(在Windows上,fyi)的zip文件中提取文件,並且每次嘗試都顯示提取的文件修改日期=提取時間(這是不正確的)。從壓縮文件中提取文件並保留mod日期 - Windows 7上的Python 2.7.1

import os,zipfile 
outDirectory = 'C:\\_TEMP\\' 
inFile = 'test.zip' 
fh = open(os.path.join(outDirectory,inFile),'rb') 
z = zipfile.ZipFile(fh) 
for name in z.namelist(): 
    z.extract(name,outDirectory) 
fh.close() 

我也試過使用.extractall方法,結果相同。

import os,zipfile 
outDirectory = 'C:\\_TEMP\\' 
inFile = 'test.zip' 
zFile = zipfile.ZipFile(os.path.join(outDirectory,inFile))   
zFile.extractall(outDirectory) 

有誰能告訴我我做錯了什麼嗎?

我想,認爲這是可能的,而不必postcorrect每here

+1

你會成爲SOOO失望... – 2012-03-21 21:39:26

回答

8

嘛修改時間,它確實需要一點後處理,但它並不壞:

import os 
import zipfile 
import time 

outDirectory = 'C:\\TEMP\\' 
inFile = 'test.zip' 
fh = open(os.path.join(outDirectory,inFile),'rb') 
z = zipfile.ZipFile(fh) 

for f in z.infolist(): 
    name, date_time = f.filename, f.date_time 
    name = os.path.join(outDirectory, name) 
    with open(name, 'wb') as outFile: 
     outFile.write(z.open(f).read()) 
    date_time = time.mktime(date_time + (0, 0, -1)) 
    os.utime(name, (date_time, date_time)) 

好吧,也許它那壞。

+1

這工作,謝謝。僅僅爲了澄清,是否將提取文件的mod日期維持爲Python的zipfile實現的限制還是所有zip庫中的標準功能? – MTAdmin 2012-03-22 14:01:28

+0

答覆已經5年了,它仍然在Python 3.6下工作。從你寫的那天起,它仍然很難看,但它很有用。 – EndermanAPM 2017-02-21 12:13:35

+0

@EndermanAPM:謝謝,我會以此爲恭維! ;) – 2017-02-21 15:28:04

4

基於伊桑墁的回答,我已經開發了這個版本(使用Python 2.6.6),這是一個小更consise:

zf = ZipFile('archive.zip', 'r') 
for zi in zf.infolist(): 
    zf.extract(zi) 
    date_time = time.mktime(zi.date_time + (0, 0, -1)) 
    os.utime(zi.filename, (date_time, date_time)) 
zf.close() 

這對提取當前的工作目錄,並使用ZipFile.extract( )方法來寫入數據,而不是創建文件本身。

3

基於Ber的回答,我開發了這個版本(使用Python 2.7.11),它也解釋了目錄mod日期。

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) 

既然作爲正在裏面他們創建解壓縮的文件目錄正在修改,似乎沒有任何意義設置其與os.utime日期,直到提取完成後,所以這個版本緩存目錄的名稱及其時間戳直到最後。

0

基於Jia103的回答,我開發了一個函數(使用Python 2.7.14),它可以在提取所有內容後保留目錄和文件日期。這樣可以隔離在功能的醜陋,你也可以使用zipfile.Zipfile.extractAll()或任何你想要的ZIP提取方法:

import time 
import zipfile 
import os 

# Restores the timestamps of zipfile contents. 
def RestoreTimestampsOfZipContents(zipname, extract_dir): 
    for f in zipfile.ZipFile(zipname, 'r').infolist(): 
     # path to this extracted f-item 
     fullpath = os.path.join(extract_dir, f.filename) 
     # still need to adjust the dt o/w item will have the current dt 
     date_time = time.mktime(f.date_time + (0, 0, -1)) 
     # update dt 
     os.utime(fullpath, (date_time, date_time)) 

要保留日期,只是調用這個函數您提取完成後。

下面是一個例子,從劇本我寫的壓縮/解壓縮遊戲保存目錄:

 z = zipfile.ZipFile(zipname, 'r') 
     print 'I have opened zipfile %s, ready to extract into %s' \ 
       % (zipname, gamedir) 
     try: os.makedirs(gamedir) 
     except: pass # Most of the time dir already exists 
     z.extractall(gamedir) 
     RestoreTimestampsOfZipContents(zipname, gamedir) #<-- USED 
     print '%s zip extract done' % GameName[game] 

感謝大家對你以前的答案!

相關問題