Python - ошибка при архивировании файлов, для формата 'L' требуется 0 <= число <= 4294967295 - PullRequest
9 голосов
/ 02 августа 2011

Я запускаю этот код для архивации папок и файлов.

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:

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

1 Ответ

2 голосов
/ 03 ноября 2011

Я думаю, это можно исправить, применив патч, прикрепленный к этому отчету об ошибке:

http://bugs.python.org/issue9720

Проблема возникает, когда файл, который вы пытаетесь включить в zip-файл, большечем 2 ^ 32-1 байт в оригинальном или сжатом виде.В этом сценарии библиотека должна хранить -1 как размер файла / сжатый размер и должна выделять некоторые дополнительные поля для хранения фактического размера, который не вписывается в 32-разрядное слово.

По некоторым причинамПатч не был принят в 3.2 или 2.7.2+, но я проверил его, и он работает нормально.Я думаю, что это не исправляет некоторый угловой случай с методом writestr (), но если вы используете только write () для хранения файлов, это прекрасно работает.

...