Python - 压缩文件时出错,'L'格式要求 0 <= 数字 <= 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
1 个回答
2
我觉得可以通过应用这个错误报告中附带的补丁来解决问题:
http://bugs.python.org/issue9720
问题出现在你想要放进压缩文件的文件大小超过了2的32次方减1字节,无论是原始文件还是压缩后的文件。在这种情况下,库需要用-1来表示文件大小或压缩大小,并且还需要额外的字段来存储实际大小,但这些大小是无法在32位的空间里存下来的。
出于某种原因,这个补丁没有在3.2或2.7.2以上的版本中被接受,但我测试过,效果很好。我觉得它没有解决writestr()方法的一些特殊情况,但如果你只是用write()来存储文件,那效果非常不错。