2013-07-12 10 views
8

मैं अल्पविराम/टैब से अलग डेटा अक्सर फ़ाइलों को इस प्रकार दिखाई देंगे साथ काम:मैं एक अजगर अचार सूची, टपल, या अन्य iterable डेटा प्रकार स्ट्रीम कर सकते हैं?

key1,1,2.02,hello,4 
key2,3,4.01,goodbye,6 
... 

मैं सूचियों की एक सूची में अजगर में पढ़ सकता है और पूर्व प्रक्रिया इस, इस तरह:

[ [ key1, 1, 2.02, 'hello', 4 ], [ key2, 3, 4.01, 'goodbye', 6 ] ] 

कभी कभी, मैं एक अचार के रूप में सूचियों की इस सूची में बचत की तरह के बाद से यह मेरी प्रविष्टियों के विभिन्न प्रकार बरकरार रखता है। यदि मसालेदार फ़ाइल बड़ी है, हालांकि, स्ट्रीमिंग फैशन में वापस सूचियों की इस सूची को पढ़ना बहुत अच्छा होगा।

अजगर में, एक धारा के रूप में एक पाठ फ़ाइल लोड करने के लिए, मैं follwoing का उपयोग प्रत्येक पंक्ति बाहर मुद्रित करने के लिए:

import pickle 
with open('big_pickled_list.pkl') as p: 
    for entry in pickle.load_streaming(p): # note: pickle.load_streaming doesn't exist 
     print entry 
:

with open('big_text_file.txt') as f: 
    for line in f: 
     print line 

मैं एक अजगर सूची के लिए कुछ इसी तरह, यानी कर सकते हैं

वहाँ "load_streaming" की तरह एक अचार समारोह है?

+1

क्या आप "स्ट्रीमिंग" द्वारा मतलब है? आप "प्रवेश" क्या चाहते हैं? आपके कोड को भी पोस्ट करें, जैसा कि पोस्ट किया गया है, संभवतः आपके द्वारा किए जाने वाले कार्यों को नहीं कर रहा है। क्या आपका मतलब है 'पी में प्रविष्टि के बजाय' पीकेएल में प्रवेश के लिए? – shx2

+0

मुझे लगता है कि "स्ट्रीमिंग" से वह अचार की अनुक्रम के रूप में एक अचार फ़ाइल को पुन: सक्रिय करता है, वैसे ही आप लाइन के अनुक्रम के रूप में एक पाठ फ़ाइल को पुन: सक्रिय कर सकते हैं, जैसा माता का जवाब करता है। – abarnert

उत्तर

9

यह काम करेगा।

क्या है तथापि करता फ़ाइल से एक वस्तु unpickle है, और फिर stdout

करने के लिए फ़ाइल की सामग्री और प्रिंट क्या तुम कर सकते हो की तरह कुछ है:

import cPickle 
with open('big_pickled_list.pkl') as p: 
    try: 
     while True: 
      print cPickle.load(p) 
    except EOFError: 
     pass 

बस इतना ही unpickle हैं ईओएफ तक पहुंचने तक फ़ाइल से ऑब्जेक्ट्स।


आप कुछ है कि for line in f: तरह काम करता है चाहते हैं, तो आप इस अप आसानी से लपेट कर सकते हैं:

def unpickle_iter(file): 
    try: 
     while True: 
      yield cPickle.load(file) 
    except EOFError: 
     raise StopIteration 

अब आप यह कर सकते हैं:

with open('big_pickled_list.pkl') as file: 
    for item in unpickle_iter(file): 
     # use item ... 
+0

अब अपने उत्तर [contextlib] (http://docs.python.org/2/library/contextlib.html) सजावट को गठबंधन करें और आप 'अनपिकल (फ़ाइल नाम) के साथ कर सकते हैं: ' – dawg

+0

@ ड्र्यूक - आपका मतलब है कि मामले में इटेटरेटर पूरी तरह से उपभोग नहीं किया जाता है या पुनरावृत्ति के दौरान अपवाद उठाया जाता है ... हाँ, मुझे वह याद आया। लेकिन मुझे नहीं लगता कि 'contextlib.contextmanager' यहां बहुत उपयोगी होगा, और समाधान के बाद और अधिक जटिल होगा [मूल रूप से अर्ननेट द्वारा सुझाया गया] (http: // stackoverflow।कॉम/संशोधन/17623631/2) स्पष्ट रूप से फ़ाइल को संदर्भ प्रबंधक के रूप में खोलने के लिए - इसलिए मैं उस पर वापस आ रहा हूं। – mata

+0

@ माता हम्म, क्षमा करें, मुझे नहीं लगता कि मैं स्पष्ट था, इसलिए मैंने अपना प्रश्न संपादित किया। मेरे पास आमतौर पर सूचियों की एक सूची है जो मेरी मसालेदार वस्तु के रूप में है, न कि मसालेदार वस्तुओं का एक पूरा सेट। Big_pickled_list में सूचियों की सूची के लिए, आपका सुझाव काम नहीं करता है। हालांकि, क्या मुझे अपने अचार में वस्तुओं को अलग-अलग स्टोर करना चाहिए? – williampli

0

एक टिप्पणी पर नजर रखने के लिए मैं स्वीकार किए जाते हैं समाधान पर किए गए, मैं और अधिक इस तरह एक पाश की सिफारिश:

import cPickle 
with open('big_pickled_list.pkl') as p: 
    while p.peek(1): 
     print cPickle.load(p) 

इस तरह आप अगर वहाँ फ़ाइल में एक भ्रष्ट वस्तु है EOFError अपवाद प्राप्त होते रहेंगे।

पूर्णता के लिए

:

def unpickle_iter(file): 
    while file.peek(1): 
     yield cPickle.load(file) 
संबंधित मुद्दे