2012-03-21 12 views
8

Python 2.7.1(Windowsではfyi)を使用してzipファイルからファイルを抽出しようとしています。変更日時=抽出時刻(これは間違っています)。zipファイルからファイルを抽出し、Windows 7でmod date-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) 

誰でも私が間違っていることを教えてもらえますか?

私はまあ、それは少し後処理がかかりますが、それは悪いことではありませんhere

+1

あなたはSOOOに失望するつもりです... –

答えて

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

それは、ありがとうございます。解明のために、ファイルの抽出日時をPythonのzipfile実装の制限に保つか、すべてのzipライブラリでこの標準的な機能を維持していますか? – MTAdmin

+0

返事から5年経っており、まだPython 3.6の下で動作しています。あなたが書いた日のようにそれはまだ醜いですが、それは機能します。 – EndermanAPM

+0

@EndermanAPM:ありがとう、私はそれを褒め言葉として服用します! ;) –

4

イーサンFumanの回答に基づいて、私はもう少しconsiseです(Pythonの2.6.6を使用して)、このバージョンを開発している:これは、(現在の作業ディレクトリに抽出しZipFile.extractを使用しています

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() 

を)メソッドを使用して、ファイル自体を作成するのではなく、データを書き込みます。

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()、またはあなたが好きなジップ抽出方法を使用することができます:あなたの抽出が行われた後だけ、この関数を呼び出し、日付を維持するには

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] 

みんなありがとうを:ここで

は、私は、ディレクトリ保存/解凍ゲームを圧縮するために書いたスクリプトから、一例です!

関連する問題