2012-01-13 5 views
22

मैं ऐसा माहौल मैं डिस्क के लिए कुछ भी नहीं बचा सकता में काम कर रहा हूँ। मुझे टैर फाइलों को खींचने और डिस्क पर सहेजे बिना उन्हें अनजिप करने में सक्षम होना चाहिए। यह असफल लगता है:पायथन का उपयोग करके, आप स्मृति में पूरी तरह से कैसे उतारते हैं?

मैं इस की कोशिश की है, लेकिन यह त्रुटियों tosses:

# fetch.py 
from cStringIO import StringIO 
import requests 
url = "http://example.com/data.tar.gz" 
response = requests.get(url) 

# ERROR is thrown here. Error shown below 
tar = tarfile.open(mode= "r:gz", fileobj = StringIO(response.content)) 

# This SHOULD break as tar.extract() saves to disk. 
# Can't tell because of error on previous line of code. 
data = tar.extract() 

कोड ब्लॉक में बताया गया है इसके बाद के संस्करण मैं त्रुटि लाइन पर निम्नलिखित ट्रैसबैक मिलती है:

Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
    File "./importers/bestbuy_fetcher.py", line 23, in download_bestbuy_batch 
    tar = tarfile.open(mode= "r:gz", fileobj = StringIO(response.content)) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/tarfile.py", line 1662, in open 
    return func(name, filemode, fileobj, **kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/tarfile.py", line 1711, in gzopen 
    **kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/tarfile.py", line 1689, in taropen 
    return cls(name, mode, fileobj, **kwargs) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/tarfile.py", line 1568, in __init__ 
    self.firstmember = self.next() 
    File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/tarfile.py", line 2324, in next 
    raise ReadError(str(e)) 
ReadError: invalid header 
+0

आपको यह त्रुटि मिल रही है क्योंकि 'response.content' मान्य gzipped tar फ़ाइल नहीं है। – geoffspear

+0

यह समझ में आता है: तो मैं इसे वैध gzipped tar फ़ाइल में कैसे बदलूं? – pydanny

+0

मेरे लिए काम करता है एक वैध tar.gz स्थानीय होस्ट से सेवा की। तुम सिर्फ एक बुरा टारबॉल प्राप्त हो सकता है। – codysoyland

उत्तर

10

बाहर कर देता है समस्या यह है कि फ़ाइल "data.tar.gz एक tar संग्रह नहीं था बस एक gzip संपीडित फ़ाइल था तो मैं इसके साथ हल:।।

# fetch.py 
from cStringIO import StringIO 
import gzip 
import requests 
# Called a 'tar' file but actually a gzip file. @#$%!!! 
url = "http://example.com/data.tar.gz" 
response = requests.get(url) 

results = gzip.GzipFile(fileobj=StringIO(response.content)) 

हर किसी को जो मदद के लिए धन्यवाद पिच इन!

+23

** यह शीर्षक में उत्पन्न प्रश्न का उत्तर नहीं है, इसलिए यह उन पाठकों के लिए बहुत भ्रमित है जो समान समस्याओं को हल करना चाहते हैं। ** – nealmcb

2

यह मदद करने के लिए

import sys 
import zipfile 
sys.argv[0] = "/home/tom/Documents/REdata/AllListing1RES.zip" 
zip_file = zipfile.ZipFile(sys.argv[0]) 
items_file = zip_file.open('AllListing1RES.txt', 'rU') 
df = read_table(items_file, sep='\t', index_col=0) 
+2

दुर्भाग्यवश, आवश्यकता कोई डिस्क एक्सेस नहीं है। ;) – pydanny

+0

समस्या यह है कि ज़िपफाइल का उपयोग जहां यह है, असमान है लेकिन आपको यह जानने की आवश्यकता है कि आप जिस संग्रह में खोज रहे हैं उसमें कौन सी फाइल है। – dartdog

15

मुझे लगता है कि त्रुटि आप कह रहा है tarfile की फ़ाइल स्वरूप गलत है चाहिए। wget के साथ फ़ाइल लाने और कमांड लाइन पर इसे अनारक्षित करने का प्रयास करें।

अन्य सवाल, कैसे अजगर डिस्क पर फ़ाइल सामग्री लिखने को रोकने के लिए के बारे में tarfile एपीआई को नज़दीक से देखने की आवश्यकता है। इसके बजाय TarFile.extract() बुलाने की मैं तुम्हें getnames() जो टार फ़ाइल में हर सदस्य के नाम वापस आ जाएगी की जरूरत है। तो फिर तुम extractfile का उपयोग करने वाले सदस्य की सामग्री को प्राप्त करने के लिए कर सकते हैं:

import tarfile  

# Open tarfile 
tar = tarfile.open(mode="r:gz", fileobj = file('foo.tgz')) 

# Iterate over every member 
for member in tar.getnames(): 
    # Print contents of every file 
    print tar.extractfile(member).read() 
+0

हाँ, tar -zxvf data.tar.gz एक "tar: अपरिचित संग्रह प्रारूप: अनुचित फ़ाइल प्रकार या प्रारूप" त्रुटि फेंकता है। यह पता लगाने की कोशिश कर रहा है कि चीज़ें कहां गलत हो रही हैं क्योंकि मैं खिड़की से खुल सकता हूं लेकिन कमांड लाइन नहीं। : पी – pydanny

+0

स्पष्ट रूप से मुझे अपने झंडे गलत मिल गए हैं। gzip -d data.tar.gz ठीक काम करता है। अब यह पता लगाने की कोशिश कर रहा है कि क्यों पाइथन का टैरफाइल अच्छा खेल नहीं रहा है। – pydanny

+0

यह अजीब बात है क्योंकि मैंने आपके जैसे ही झंडे का उपयोग किया और सकारात्मक परिणाम प्राप्त किया ... – snim2

6

आप की कोशिश कर सकते कि हम क्या किया था जब अनुरोध के साथ + टार निपटने:

| extractfile(self, member) 
|  Extract a member from the archive as a file object. `member' may be 
|  a filename or a TarInfo object. If `member' is a regular file, a 
|  file-like object is returned. If `member' is a link, a file-like 
|  object is constructed from the link's target. If `member' is none of 
|  the above, None is returned. 
|  The file-like object is read-only and provides the following 
|  methods: read(), readline(), readlines(), seek() and tell() 

यहाँ एक उदाहरण है का उपयोग करें | फ़ाइल खोलने के लिए मोड। विवरण के लिए http://docs.python.org/library/tarfile.html#tarfile.open देखें।

आप मूल रूप से आप tarfile.open(mode='r|gz', fileobj=response.raw) का उपयोग कर टार फ़ाइल को खोलने https://github.com/djeese/djeese-client/blob/master/djeese/commands/clonestatic.py#L53

पर कोड देख सकते हैं।

यह हमारे लिए शानदार काम किया, और उम्मीद है कि आप के लिए भी करता है।

+0

कोशिश की लेकिन यह असफल रहा क्योंकि क्लाइंट एक gzip फ़ाइल प्रदान कर रहा था जो एक टैरिफाइल होने का नाटक करता था। एक शुद्ध gzip समाधान का उपयोग कर तय समस्या। :) – pydanny

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