2011-08-02 10 views
9

Uruchamiam ten kod, aby skompresować foldery i pliki.Python - błąd podczas kompresowania plików, format "L" wymaga 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)) 

Ale wtedy ten błąd:

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

przykład w pliku gdzie to się dzieje:

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

Wszelkie pomysły jak mogę rozwiązać ten problem?

Traceback:

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

Która linia powoduje błąd? –

+2

Czy twój plik jest większy niż 4 GB? I wklej cały komunikat zwrotny. –

+0

Katalog rozpakowany ma łączną pojemność 6 GB, ale plik w przykładzie to około 1 GB. – Aola

Odpowiedz

2

Myślę, że może być ustalona stosowania plastra załączony do niniejszego raportu o błędzie:

http://bugs.python.org/issue9720

Problem pojawia się, gdy plik staramy się zawierać w plik zip jest większy niż 2^32-1 bajtów w oryginalnej lub skompresowanej formie. W tym scenariuszu biblioteka musi przechowywać -1 jako rozmiar pliku/skompresowany rozmiar i musi przydzielić dodatkowe pola do przechowywania rzeczywistego rozmiaru, który nie mieści się w 32-bitowym dword.

Z jakiegoś powodu łatka nie została zaakceptowana w wersji 3.2 lub 2.7.2+, ale przetestowałem ją i działa ona prawidłowo. Wydaje mi się, że nie rozwiązuje to problemu z metodą writestr(), ale jeśli używasz write() do przechowywania plików, to działa świetnie.

Powiązane problemy