2016-01-28 16 views
12

मैं कुछ डेटा और इस तरह संग्रहीत इसे कई बार बनाया:अचार फ़ाइल कैसे पढ़ा जाए?

with open('filename', 'a') as f: 
     pickle.dump(data, f) 

हर बार जब फ़ाइल के आकार में वृद्धि हुई है, लेकिन जब मैं फ़ाइल

with open('filename', 'rb') as f: 
    x = pickle.load(f) 

खोलने मैं केवल पिछली बार से डेटा को देखते हैं। मैं फ़ाइल को सही तरीके से कैसे पढ़ सकता हूं?

+1

आप अपनी फ़ाइल में ऑब्जेक्ट्स जोड़ रहे हैं। जब आप अनपिक करते हैं तो आप केवल पहली प्रविष्टि को अनपिक करते हैं। क्या आप वाकई उन सभी प्रविष्टियों की ज़रूरत है? यदि नहीं - 'ओपन (' फ़ाइल नाम ',' wb ') में बदलें' – Andrey

+0

हां, मुझे सभी प्रविष्टियों की आवश्यकता है। फाइलों का आकार दिखाता है कि इसमें यह सब शामिल है। –

+1

फिर @jsbueno अपने जवाब में सही है। – Andrey

उत्तर

21

पिक एक समय में एक ही ऑब्जेक्ट को क्रमबद्ध करता है, और एक ऑब्जेक्ट को वापस पढ़ता है - मसालेदार डेटा फ़ाइल पर अनुक्रम में दर्ज किया जाता है।

यदि आप बस pickle.load करते हैं तो आपको फ़ाइल में क्रमबद्ध पहली वस्तु को पढ़ना चाहिए (जैसा कि आपने लिखा है अंतिम नहीं)।

पहली वस्तु unserializing के बाद, फ़ाइल-सूचक अगले ऑब्जेक्ट की शुरुआत पर है - अगर आप बस फिर pickle.load कहते हैं, यह है कि अगले वस्तु पढ़ा जाएगा - ऐसा है कि फाइल के अंत तक।

objects = [] 
with (open("myfile", "rb")) as openfile: 
    while True: 
     try: 
      objects.append(pickle.load(openfile)) 
     except EOFError: 
      break 
-5

आप इसके साथ कुछ भी नहीं करते हैं, केवल फाइल लोड कर रहे हैं।

for line in x: 
    print x 

प्रत्येक पंक्ति को प्रिंट करेगा। (कथन के साथ दूसरे में)

2

निम्नलिखित उदाहरण है कि आप एक अचार फ़ाइल कैसे लिख सकते हैं और पढ़ सकते हैं। ध्यान दें कि यदि आप फ़ाइल में अचार डेटा जोड़ते रहते हैं, तो आपको फ़ाइल से पढ़ना जारी रखना होगा जब तक कि आप जो चाहते हैं उसे प्राप्त न करें या फ़ाइल के अंत तक पहुंचने के द्वारा अपवाद उत्पन्न हो। आखिरी फ़ंक्शन यही करता है।

import os 
import pickle 


PICKLE_FILE = 'pickle.dat' 


def main(): 
    # append data to the pickle file 
    add_to_pickle(PICKLE_FILE, 123) 
    add_to_pickle(PICKLE_FILE, 'Hello') 
    add_to_pickle(PICKLE_FILE, None) 
    add_to_pickle(PICKLE_FILE, b'World') 
    add_to_pickle(PICKLE_FILE, 456.789) 
    # load & show all stored objects 
    for item in read_from_pickle(PICKLE_FILE): 
     print(repr(item)) 
    os.remove(PICKLE_FILE) 


def add_to_pickle(path, item): 
    with open(path, 'ab') as file: 
     pickle.dump(item, file, pickle.HIGHEST_PROTOCOL) 


def read_from_pickle(path): 
    with open(path, 'rb') as file: 
     try: 
      while True: 
       yield pickle.load(file) 
     except EOFError: 
      pass 


if __name__ == '__main__': 
    main() 
संबंधित मुद्दे