2010-12-13 11 views
4

特定の構造に従った複数のzipファイルで複数のフォルダを圧縮するためのスクリプトを少し作成しています。私は構造体をリストとして構築しました。いくつかのエントリがあります:PythonのZipFileモジュール - ランタイムの問題

['E:\Documents\UFSCar\Primeiro Ano\Primeiro Semestre\Cálculo 1', 
'E:\Documents\UFSCar\Primeiro Ano\Segundo Semestre\Estatistica', 
'E:\Documents\UFSCar\Primeiro Ano\Segundo Semestre\Estruturas Discretas', 
'E:\Documents\UFSCar\Primeiro Ano\Segundo Semestre\Introdução à Engenharia'] 

ここでは、ファイルをまとめて圧縮する2つの方法があります。

def zipit (path, archname): 
    # Create a ZipFile Object primed to write 
    archive = ZipFile(archname, "w", ZIP_DEFLATED) # "a" to append, "r" to read 
    # Recurse or not, depending on what path is 
    if os.path.isdir(path): 
     zippy(path, archive) 
    else: 
     archive.write(path) 
    archive.close() 
    return "Compression of \""+path+"\" was successful!" 

def zippy(path,archive): 
    paths = os.listdir(path) 
    for p in paths: 
     p = os.path.join(path,p) 
     if os.path.isdir(p): 
      zippy(p,archive) 
     else: 
      archive.write(p) 
    return 

主要部分は、スクリプトはこのようなものですOS:これは、ファイルの大きな数のためによく実行するスクリプトを作ったので、私は、数値インデックスを使用しました

for i in range(len(myList)): 
    zipit(myList[i],os.path.split(myList[i])[1]) 

。それ以前は、私たちが書いたzipファイルは2つしかありません。このようにして、約8人が最後まで道を行く。なぜか言わない。

スクリプトは単純にリストを反復し、各スクリプトを個別のzipファイルとして圧縮します。問題は、リストのサイズが大きい場合に発生します。次のエラーメッセージが表示されます。

Traceback (most recent call last): 
    File "E:\Documents\UFSCar\zipit.py", line 76, in <module> 
    zipit(listaDisciplinas[i],os.path.split(listaDisciplinas[i])[1]) 
    File "E:\Documents\UFSCar\zipit.py", line 22, in zipit 
    zippy(path, archive) 
    File "E:\Documents\UFSCar\zipit.py", line 11, in zippy 
    zippy(p,archive) 
    File "E:\Documents\UFSCar\zipit.py", line 11, in zippy 
    zippy(p,archive) 
    File "E:\Documents\UFSCar\zipit.py", line 13, in zippy 
    archive.write(p) 
    File "C:\Python27\lib\zipfile.py", line 994, in write 
    mtime = time.localtime(st.st_mtime) 
ValueError: (22, 'Invalid argument') 

このエラーの原因は分かりますか?感謝! ありがとう!

EDIT:

私はファイルをTESTEするには、以下の提供されたコードを使用しました、問題は、彼らの「最終更新」のタイムスタンプに問題を持つファイルでした。何らかの理由で未知のものがあったが、そのうちのいくつかは2049年に最後の修正を行った。

その場合、Python zipfileモジュールは、ValueErrorがスローされたときにファイルを圧縮できませんでした。

私の解決策:問題のあるファイルをタイムスタンプに変更してください。いつかはもっと良い解決策があると私は確かに検証します。

誰もが助けてくれてありがとう。

+1

print文をzipfile.pyに入れて、この呼び出しのすぐ上のst.st_mtimeの値を出力できますか? –

+1

影響を受けるファイルのmtimeは何ですか? –

答えて

4

は、この問題に関連するバグレポートは、2007年に提出されました:http://bugs.python.org/issue1760357

問題は、Windowsのlocaltimeの機能のバグが原因であり、ValueErrorをを投げるよりも時間モジュールは、他のできることは何もありません。

私はこのような問題を回避ました:

try: 
    zip.write(absfilename, zipfilename) 
except ValueError: 
    os.utime(absfilename, None) 
    zip.write(absfilename, zipfilename) 

os.utimeラインは、現在の時刻に、ファイルのアクセスと修正時刻を更新します。

0

mtimeは、ファイルが最後に変更されたときのタイムスタンプです。したがって、おそらく1つのファイルに対して何らかの形で無効です。どのファイルが原因であるか調べて、os.stat(filename).st_mtimeと呼んで確認してください。

0

これがうまくいくかどうかを確認してください。少なくとも、失敗したファイルとその理由を知ることができます。

import os 
import os.path 
from time import localtime 
from zipfile import ZipFile, ZIP_DEFLATED 

def zipper(zipfilename, directory): 
    archive = ZipFile(zipfilename, "w", ZIP_DEFLATED) 
    for root, dirs, files in os.walk(directory): 
     for f in files: 
      path = os.path.join(root, f) 
      try: 
       archive.write(path) 
      except ValueError, err: 
       print "Error compressing %s" % path 
       s = os.stat(path) 
       print s.st_mtime 
       print localtime(s.st_mtime) 
       print str(err) 
    archive.close() 

if __name__ == '__main__': 
    zipper('foo.zip', '.') 
+0

私はあなたのコードを試して、2098年のタイムスタンプ付きのファイルにエラーがありました。私は、これがオーバーフローの原因と考えて、エラーだと思います。今、私は7Zipのようなプログラムでこのファイルを圧縮しようとしています。ところで、あなたのアルゴリズムは私にエラーを検出させましたが、フォルダを圧縮すると、zipファイルの中にフォルダ構造が保持されません。 –