2011-08-02 12 views
9

मैं फ़ोल्डर्स और फ़ाइलों को ज़िप करने के लिए इस कोड को चलाता हूं।पायथन - फ़ाइलों को ज़िप करते समय त्रुटि, 'एल' प्रारूप को 0 <= संख्या <= 4294967295

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

फ़ाइल नाम पर उदाहरण जहां ऐसा होता है:

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

कोई भी विचार कैसे मैं इसे ठीक कर सकते

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)) 

लेकिन तब मैं इस त्रुटि मिलती है?

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

कौन सी लाइन त्रुटि को ट्रिगर करती है? –

+2

आपकी फाइल 4 जीबी से बड़ी है? और कृपया पूर्ण ट्रेसबैक पेस्ट करें। –

+0

ज़िप्ड की गई निर्देशिका कुल 6 जीबी है, लेकिन उदाहरण में फ़ाइल लगभग 1 जीबी है। – Aola

उत्तर

2

मुझे लगता है कि यह पैच इस बग रिपोर्ट के साथ संलग्न आवेदन कर ठीक किया जा सकता:

http://bugs.python.org/issue9720

समस्या पैदा होती है जब फ़ाइल आप में शामिल करने के लिए कोशिश कर रहे हैं ज़िप फ़ाइल मूल या संपीड़ित रूप में 2^32-1 बाइट से बड़ी है। इस परिदृश्य में पुस्तकालय को फ़ाइल आकार/संपीड़ित आकार के रूप में स्टोर करने की आवश्यकता है और वास्तविक आकार को स्टोर करने के लिए कुछ अतिरिक्त फ़ील्ड आवंटित करना है, जो 32-बिट डवर्ड में फिट नहीं है।

किसी कारण से पैच 3.2 या 2.7.2+ में स्वीकार नहीं किया गया है, लेकिन मैंने इसका परीक्षण किया है और यह ठीक काम करता है। मुझे लगता है कि यह लेखक() विधि के साथ कुछ कोने केस को ठीक नहीं करता है, लेकिन यदि आप फ़ाइलों को स्टोर करने के लिए केवल लिखने() का उपयोग करते हैं तो यह बहुत अच्छा काम करता है।