2011-08-02 6 views
9

このコードを実行すると、フォルダとファイルが圧縮されます。Python - ファイルを圧縮するときにエラーが発生します。 'L'形式には0が必要です。<number> = 4294967295

def save_folder_as_zip(self, folder_to_zip, save_as): 
    zipf = zipfile.ZipFile(str(save_as), mode="w", allowZip64=True) 
    self.create_zip(zipf, folder_to_zip) 
    zipf.close() 

    return zipf 

def create_zip(self, zipf, directory, folder=""): 

    directory = directory.encode("utf-8") 

    for item in os.listdir(directory): 
     if temp_folder == directory + os.sep: 
      continue 

     try: 
      if os.path.isfile(os.path.join(directory, item)): 
       zipf.write(os.path.join(directory, item), folder + os.sep + item) 
      elif os.path.isdir(os.path.join(directory, item)): 
       self.create_zip(zipf, os.path.join(directory, item).decode("utf-8"), folder + os.sep + item) 
     except Exception, e: 
      self.schedule.machine.log_warning(str(e)) 

しかし、その後、私はこのエラーを取得:この問題が発生したファイル名に

'L' format requires 0 <= number <= 4294967295 

例:

/[Wii]TrackMania[PAL][WiiSOS.com]/ws_tramap.iso 

私はこの問題を解決することができますどのように任意のアイデア?

トレースバック:

Traceback (most recent call last): 
File "test.py", line 29, in <module> 
    save_folder_as_zip("/Users/f/Downloads/", "hei.zip") 
File "test.py", line 13, in save_folder_as_zip 
    create_zip(zipf, folder_to_zip) 
File "test.py", line 26, in create_zip 
    create_zip(zipf, os.path.join(directory, item).decode("utf-8"), folder + os.sep + item) 
File "test.py", line 24, in create_zip 
    zipf.write(os.path.join(directory, item), folder + os.sep + item) 
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/zipfile.py", line 1100, in write 
    zinfo.file_size)) 
struct.error: 'L' format requires 0 <= number <= 4294967295 
+0

どの行がエラーをトリガしますか? –

+2

ファイルが4GBを超えていますか?完全なトレースバックを貼り付けてください。 –

+0

圧縮されたディレクトリは合計6GBですが、この例のファイルは約1GBです。 – Aola

答えて

2

私はそれがこのバグレポートに添付のパッチを適用する固定することができると思います。

http://bugs.python.org/issue9720

ファイルは、あなたがに含めるしようとしているときに問題が発生zipファイルは元の形式または圧縮形式で2^32-1バイトを超えています。このシナリオでは、ライブラリはファイルサイズ/圧縮サイズとして-1を格納する必要があり、32ビットのdwordに収まらない実際のサイズを格納するためにいくつかの余分なフィールドを割り当てる必要があります。

パッチは何らかの理由で3.2または2.7.2以降では受け入れられませんでしたが、テストしても問題なく動作します。私はwritestr()メソッドでいくつかのコーナーケースを修正することはできないと思うが、write()を使ってファイルを保存するだけではうまくいきます。

関連する問題