2012-10-09 9 views
5

एक नई समस्या से मेरा सिर खटखटाते हुए लगता है और मैं नौसिखिया नहीं हूं। मेरे पास 1.2 जी ज्ञात-अच्छा ज़िपफाइल 'train.zip' है जिसमें 3.5 जी फ़ाइल 'train.csv' है। मैं ज़िपफाइल खोलता हूं और बिना किसी अपवाद के फ़ाइल करता हूं (लार्जज़िपफाइल), लेकिन परिणामी फाइलस्ट्रीम खाली प्रतीत होता है। (यूनिक्स 'unzip -c ...' यह पुष्टि करता है कि यह अच्छा है) ZipFile.open() द्वारा लौटाई गई फ़ाइल ऑब्जेक्ट्स खोजने योग्य नहीं हैं या बताए जा सकते हैं, इसलिए मैं इसे जांच नहीं सकता।असमर्थित संपीड़न-प्रकार के ज़िपिंग को खोलने के लिए चुपचाप खाली filestream देता है, अपवाद फेंकने के बजाय

पायथन वितरण 2.7.3 ईपीडी मुक्त 7.3-1 (32-बिट); लेकिन बड़े ज़िप के लिए ठीक होना चाहिए। ओएस MacOS 10.6.6

import csv 
import zipfile as zf 

zip_pathname = os.path.join('/my/data/path/.../', 'train.zip') 
#with zf.ZipFile(zip_pathname).open('train.csv') as z: 
z = zf.ZipFile(zip_pathname, 'r', zf.ZIP_DEFLATED, allowZip64=True) # I tried all permutations 
z.debug = 1 
z.testzip() # zipfile integrity is ok 

z1 = z.open('train.csv', 'r') # our file keeps coming up empty? 

# Check the info to confirm z1 is indeed a valid 3.5Gb file... 
z1i = z.getinfo(file_name) 
for att in ('filename', 'file_size', 'compress_size', 'compress_type', 'date_time', 'CRC', 'comment'): 
    print '%s:\t' % att, getattr(z1i,att) 
# ... and it looks ok. compress_type = 9 ok? 
#filename: train.csv 
#file_size: 3729150126 
#compress_size: 1284613649 
#compress_type: 9 
#date_time: (2012, 8, 20, 15, 30, 4) 
#CRC: 1679210291 

# All attempts to read z1 come up empty?! 
# z1.readline() gives '' 
# z1.readlines() gives [] 
# z1.read() takes ~60sec but also returns '' ? 

# code I would want to run is: 
reader = csv.reader(z1) 
header = reader.next() 
return reader 

उत्तर

11

है कारण का संयोजन है:

  • इस फाइल के संपीड़न प्रकार है प्रकार 9: Deflate64/बढ़ी Deflate (PKWare के भद्दा मालिकाना प्रारूप)
  • और zipfile बग: यह असमर्थित संपीड़न-प्रकारों के लिए अपवाद नहीं फेंक देगा। यह केवल silently return a bad file object [धारा 4.4.5 संपीड़न विधि] के लिए उपयोग किया जाता था। Aargh। कितना फर्जी मैंने उस बग को दायर किया और अब यह संपीड़न प्रकार अज्ञात होने पर NotImplementedError उठाता है। हवा निकाल:

एक कमांड लाइन वर्कअराउंड अनज़िप करने के लिए, तो rezip, एक सादे प्रकार 8 प्राप्त करने के लिए है।

zipfile will throw an exception in 2.7,3.2+ मुझे लगता है कि ज़िप कारण वास्तव में कानूनी कारणों से टाइप 9 को संभालने में सक्षम नहीं होंगे। अजगर दस्तावेज़ जिसे zipfile जो भी कोई जिक्र नहीं कर सकते handle other compression types :(

+0

क्या आप जानते हैं कि संपीड़न प्रकार की जांच कैसे करें, ताकि आप चुप विफलता की उम्मीद कर सकें? –

+0

@MartinTaleski: मैंने एक बग दायर किया, उन्होंने इसे हल किया, और संपीड़न प्रकार अज्ञात होने पर अब यह NotImplementedError उठाता है। आप कोशिश कर सकते हैं .. पकड़ो। पकड़ो। EAFP दर्शन। – smci

1

यह संभव है कि फ़ाइल बहुत बड़ी है अजगर में स्मृति को निकालने के लिए के लिए है बनाता है? यह काम करता है जब train.csv छोटी है?

आप यहां एक सचित्र विधि का उपयोग करके पढ़ने की कोशिश कर सकते हैं: How do you unzip very large files in python?

+0

Si ज़ी मुद्दा नहीं है। मैंने यहां इस मुद्दे को लिखा है (असमर्थित संपीड़न-प्रकार + बग कि ज़िपफाइल अपवाद फेंक नहीं देता है और चुपचाप खराब फ़ाइल ऑब्जेक्ट देता है)। क्या एक क्रॉक है। – smci

संबंधित मुद्दे