2008-09-18 7 views
9

मुझे पाइथन का उपयोग कर दूरस्थ ज़िप संग्रह से फ़ाइल नाम से मेल खाने वाली चयनित फ़ाइलों को पढ़ने की आवश्यकता है। मैं पूर्ण ज़िप को अस्थायी फ़ाइल में सहेजना नहीं चाहता (यह इतना बड़ा नहीं है, इसलिए मैं स्मृति में सब कुछ संभाल सकता हूं)।मैं पाइथन का उपयोग कर HTTP पर रिमोट ज़िप संग्रह से चयनित फ़ाइलों को कैसे पढ़ूं?

मैंने पहले ही कोड लिखा है और यह काम करता है, और मैं इसका उत्तर दे रहा हूं ताकि मैं बाद में इसकी खोज कर सकूं। लेकिन चूंकि सबूत बताते हैं कि मैं स्टैक ओवरफ्लो पर डंबर प्रतिभागियों में से एक हूं, मुझे यकीन है कि सुधार के लिए जगह है।

उत्तर

8

यहाँ कैसे मैंने किया (".ranks" में समाप्त होने वाले सभी फाइलों को हथियाने) है:

import urllib2, cStringIO, zipfile 

try: 
    remotezip = urllib2.urlopen(url) 
    zipinmemory = cStringIO.StringIO(remotezip.read()) 
    zip = zipfile.ZipFile(zipinmemory) 
    for fn in zip.namelist(): 
     if fn.endswith(".ranks"): 
      ranks_data = zip.read(fn) 
      for line in ranks_data.split("\n"): 
       # do something with each line 
except urllib2.HTTPError: 
    # handle exception 
+0

आप के साथ पहली पंक्ति बदलना चाहते हैं। – Jim

+0

आप 'ज़िपफाइल (urllib2.urlopen (url)) का उपयोग क्यों नहीं करते हैं? – jfs

+0

मैंने कोशिश की, लेकिन मैं इसे काम नहीं कर सका क्योंकि भले ही यह एक फ़ाइल जैसी वस्तु थी, लेकिन यह किसी विशेष कार्य का समर्थन नहीं करता था जिसे ज़िफाइल की आवश्यकता थी। यही कारण है कि मैं इसे cStringIO के साथ buffered। –

2

धन्यवाद आपके प्रश्न और उत्तर के लिए मार्सेल (मुझे एक अलग संदर्भ में एक ही समस्या थी और फ़ाइल जैसी वस्तुओं के साथ एक ही समस्या का सामना करना पड़ा वास्तव में फ़ाइल की तरह नहीं)! बस एक अद्यतन के रूप में: अजगर 3.0 के लिए, अपने कोड थोड़ा संशोधित करने की आवश्यकता है:

import urllib.request, io, zipfile 

try: 
    remotezip = urllib.request.urlopen(url) 
    zipinmemory = io.BytesIO(remotezip.read()) 
    zip = zipfile.ZipFile(zipinmemory) 
    for fn in zip.namelist(): 
     if fn.endswith(".ranks"): 
      ranks_data = zip.read(fn) 
      for line in ranks_data.split("\n"): 
       # do something with each line 
except urllib.request.HTTPError: 
    # handle exception 
संबंधित मुद्दे

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