2012-03-21 12 views
8

पर पायथन 2.7.1 मैं पाइथन 2.7.1 (विंडोज़, fyi) का उपयोग करके ज़िप फ़ाइल से फ़ाइलों को निकालने का प्रयास कर रहा हूं और मेरे प्रत्येक प्रयास निकाले गए फाइलों को दिखाता है संशोधित दिनांक = निष्कर्षण का समय (जो गलत है) के साथ।ज़िप फ़ाइल से फ़ाइलों को निकालें और मोड दिनांक को बनाए रखें- विंडोज 7

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) 

क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं?

मैं प्रति here

+1

आप सूओ निराश होने जा रहे हैं ... –

उत्तर

8

खैर संशोधित समय postcorrect बिना सोचने के लिए यह संभव है करना चाहते हैं, यह एक छोटे पोस्ट-प्रोसेसिंग ले करता है, लेकिन यह है कि बुरा नहीं है:

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

यह काम करता है, धन्यवाद। सिर्फ स्पष्टीकरण के लिए, फाइलों के निष्कर्षण पर पाइथन के ज़िपफाइल कार्यान्वयन की सीमा पर आधुनिक तिथि को बनाए रखना है या यह सभी ज़िप libs में यह मानक कार्यक्षमता है? – MTAdmin

+0

उत्तर के बाद से यह 5 साल हो गया है, और यह अभी भी पायथन 3.6 के तहत काम कर रहा है। जिस दिन आपने इसे लिखा था, वह अभी भी बदसूरत है, लेकिन यह काम करता है। – EndermanAPM

+0

@EndermanAPM: धन्यवाद, मैं इसे तारीफ के रूप में ले जाऊंगा! ;) –

4

एतान Fuman के जवाब के आधार पर, मैं इस संस्करण (अजगर 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

बेर के उत्तर के आधार पर, मैंने इस संस्करण को विकसित किया है (पायथन 2.7.11 का उपयोग करके), जो निर्देशिका मोड तिथियों के लिए भी खाता है।

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 के उत्तर के आधार पर, मैंने एक फ़ंक्शन विकसित किया है (पायथन 2.7.14 का उपयोग करके) जो निर्देशिका और फ़ाइल तिथियों को संरक्षित करता है सब कुछ निकालने के बाद। इस समारोह में किसी भी कुरूपता को अलग कर देता है, और आप भी zipfile.Zipfile.extractAll() या जो कुछ भी जिप निकालने विधि आप चाहते हैं का उपयोग कर सकते हैं:

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] 

धन्यवाद:

यहाँ एक उदाहरण है, एक स्क्रिप्ट मैं ज़िप करने के लिए लिखा था से/unzip खेल निर्देशिका को बचाने!

संबंधित मुद्दे