সংরক্ষণ করা এবং বস্তু লোড করা এবং আচার ব্যবহার


114

আমি pickleমডিউলটি ব্যবহার করে অবজেক্টগুলি সংরক্ষণ এবং লোড করার চেষ্টা করছি ।
প্রথমে আমি আমার জিনিসগুলি ঘোষণা করি:

>>> class Fruits:pass
...
>>> banana = Fruits()

>>> banana.color = 'yellow'
>>> banana.value = 30

এর পরে আমি 'ফ্রুটস.ওবজ' নামে একটি ফাইল খুলি (এর আগে আমি একটি নতুন .txt ফাইল তৈরি করেছি এবং আমি নামকরণ করেছি 'ফলস.ওবজ'):

>>> import pickle
>>> filehandler = open(b"Fruits.obj","wb")
>>> pickle.dump(banana,filehandler)

এটি করার পরে আমি আমার অধিবেশনটি বন্ধ করে দিয়েছি এবং আমি একটি নতুন শুরু করেছি এবং আমি পরবর্তীটি রেখেছি (যে বস্তুটি এটি সংরক্ষণ করা উচিত বলে অ্যাক্সেস করার চেষ্টা করছি):

file = open("Fruits.obj",'r')
object_file = pickle.load(file)

তবে আমার এই বার্তাটি রয়েছে:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\pickle.py", line 1365, in load
encoding=encoding, errors=errors).load()
ValueError: read() from the underlying stream did notreturn bytes

আমি কী করতে হবে তা জানি না কারণ আমি এই বার্তাটি বুঝতে পারি না। কেউ কি জানেন যে আমি কীভাবে আমার বস্তু 'কলা' লোড করতে পারি? ধন্যবাদ!

সম্পাদনা: আপনারা কেউ কেউ sugested হিসাবে আমি রেখেছি:

>>> import pickle
>>> file = open("Fruits.obj",'rb')

কোনও সমস্যা ছিল না, তবে পরবর্তীটি আমি রেখেছিলাম:

>>> object_file = pickle.load(file)

এবং আমার ত্রুটি রয়েছে:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python31\lib\pickle.py", line 1365, in load
encoding=encoding, errors=errors).load()
EOFError


উত্তর:


74

আপনার দ্বিতীয় সমস্যা হিসাবে:

 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 File "C:\Python31\lib\pickle.py", line
 1365, in load encoding=encoding,
 errors=errors).load() EOFError

আপনি ফাইলটির বিষয়বস্তু পড়ার পরে, ফাইল পয়েন্টারটি ফাইলের শেষে থাকবে - পড়ার জন্য আর কোনও ডেটা থাকবে না। আপনাকে ফাইলটি রিওয়াইন্ড করতে হবে যাতে এটি প্রথম থেকে আবার পড়তে হবে:

file.seek(0)

আপনি সাধারণত যা করতে চান তা হ'ল ফাইলটি খোলার জন্য এবং এটি থেকে ডেটা পড়ার জন্য একটি প্রসঙ্গ পরিচালককে ব্যবহার করা। এইভাবে, ব্লকটি সম্পাদন শেষ হওয়ার পরে ফাইলটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে, যা আপনাকে আপনার ফাইল অপারেশনগুলিকে অর্থপূর্ণ খণ্ডে সংগঠিত করতে সহায়তা করবে।

পরিশেষে, সিপিকেল সি-তে আচার মডিউলের একটি দ্রুত বাস্তবায়ন So

In [1]: import cPickle

In [2]: d = {"a": 1, "b": 2}

In [4]: with open(r"someobject.pickle", "wb") as output_file:
   ...:     cPickle.dump(d, output_file)
   ...:

# pickle_file will be closed at this point, preventing your from accessing it any further

In [5]: with open(r"someobject.pickle", "rb") as input_file:
   ...:     e = cPickle.load(input_file)
   ...:

In [7]: print e
------> print(e)
{'a': 1, 'b': 2}

এটি 'd = {"এ": 1, "বি": 2}' কী ধরণের ডেটা স্ট্রাকচার?
পিটারস্টোন

1
@ পিটারস্টোন: {"a": 1, "b": 2}কীগুলি "a"এবং এতে একটি অভিধান তৈরি "b"করে। অনলাইন ডকুমেন্টেশনে একে ডিকশনারি ডিসপ্লে এক্সপ্রেশন বলে । এটি dictপাইথনের যে কয়েকটি স্ট্যান্ডার্ড বিল্ট-ইন ডেটাটাইপগুলি উপলভ্য, সেগুলির মধ্যে নির্মিত বিভিন্ন ধরণের একটি অবজেক্টের মধ্যে কেবল একটির মধ্যে একটি
মার্টিনিউ

2
'R' অক্ষরটি ফাইলের নামটি কেন এগিয়ে যায়? আমি দস্তাবেজে এটি দেখতে পাচ্ছি না। এছাড়াও ফাইলনামের জন্য ভেরিয়েবল ব্যবহার করা শক্ত করে তোলে।
শেরিলহোমান

7
আজ এই উত্তরটির দিকে তাকানো এবং এটি লক্ষ্য করা কেবল পাইথন ২.x এর ক্ষেত্রে প্রযোজ্য। পাইথন 3.x এ, সরাসরি ব্যবহার করা উচিত যা ক্যান না থাকলে স্বয়ংক্রিয়ভাবে pickleআমদানি করবে cpickledocs.python.org/3.1/whatsnew/3.0.html# লাইব্রেরি- পরিবর্তনগুলি
এসকেপ্প

41

নিম্নলিখিতটি আমার পক্ষে কাজ করে:

class Fruits: pass

banana = Fruits()

banana.color = 'yellow'
banana.value = 30

import pickle

filehandler = open("Fruits.obj","wb")
pickle.dump(banana,filehandler)
filehandler.close()

file = open("Fruits.obj",'rb')
object_file = pickle.load(file)
file.close()

print(object_file.color, object_file.value, sep=', ')
# yellow, 30

এটি আমার কাজ করে তবে আমি যা খুঁজছি তা হল একটি সেশন বন্ধ করা, একটি নতুন খুলুন এবং আমি আগের সেশনে যা সঞ্চয় করি তা লোড করা। "ফাইলহ্যান্ডলার.ক্লোজ ()" লাইনটি স্থাপন করার পরে আমি সেশনটি বন্ধ করি এবং আমি একটি নতুন খুলি এবং আমি আপনার বাকী কোডটি রেখে দিই, তারপরে "অবজেক্ট_ফিল = পিকেল.লোড (ফাইল)" লাগানোর পরে আমি এই ত্রুটি পেয়েছি: ট্রেসব্যাক ( সর্বশেষতম কল শেষ): "মডেল> অবজেক্ট_ফাইলে = পিক.এলডি (ফাইল)" "<pyshell # 5>", লাইন 1, ফাইল "সি: \ পাইথন 31 \ lib \ pickle.py", লাইন 1365, লোড এনকোডিংয়ে = এনকোডিং, ত্রুটি = ত্রুটিগুলি দেখে) .load () AttributeError: 'মডিউল' অবজেক্ট কোন অ্যাট্রিবিউট 'ফল' হয়েছে
Peterstone

3
@ পিটারস্টোন: দ্বিতীয় অধিবেশনে আপনার class Fruitsসংজ্ঞায়িতের সংজ্ঞা থাকতে হবে যাতে pickle.load()বাইনারি ফাইলে সংরক্ষিত ডেটা থেকে অবজেক্টটি পুনর্গঠন করতে পারে। এই ধরণের জিনিসটির জন্য সর্বোত্তম অনুশীলন হ'ল class Fruitsসংজ্ঞাটি একটি আলাদা .py ফাইল (এটি একটি কাস্টম মডিউল তৈরি করা) এবং তারপরে importসেই মডিউল বা আইটেমগুলি যখনই প্রয়োজন হয় (অর্থাত্ উভয় সেশন) put উদাহরণস্বরূপ, আপনি যদি এটি কোনও ফাইলের মধ্যে রাখেন MyDataDefs.pyতবে আপনি লিখতে পারেন from MyDataDefs import Fruits। এটি অস্পষ্ট কিনা তা আমাকে জানান এবং আমি সেই অনুযায়ী আমার উত্তর আপডেট করব।
মার্টিনো

প্রকৃতপক্ষে পিইপি 8 মডিউল নামের জন্য সমস্ত ছোট হাতের অক্ষর ব্যবহার করার পরামর্শ দেয় , তাই আমার শেষ মন্তব্যের শেষে উদাহরণটি my_data_defs.pyব্যবহার করে নামকরণ করা কোনও ফাইলে থাকা উচিত ছিল from my_data_defs import Fruits
মার্টিনিউ

24

আপনি এটিকে বাইনারি হিসাবে পড়তে ভুলে যাচ্ছেন।

আপনার লেখার অংশে আপনার রয়েছে:

open(b"Fruits.obj","wb") # Note the wb part (Write Binary)

পড়ার অংশে আপনার রয়েছে:

file = open("Fruits.obj",'r') # Note the r part, there should be a b too

সুতরাং এটির সাথে এটি প্রতিস্থাপন করুন:

file = open("Fruits.obj",'rb')

এবং এটি কাজ করবে :)


আপনার দ্বিতীয় ত্রুটি হিসাবে, সম্ভবত ফাইলটি সঠিকভাবে বন্ধ / সিঙ্ক না করেই এটি সম্ভবত কারণ।

এই বিট কোডটি লিখতে চেষ্টা করুন:

>>> import pickle
>>> filehandler = open(b"Fruits.obj","wb")
>>> pickle.dump(banana,filehandler)
>>> filehandler.close()

এবং এটি (অপরিবর্তিত) পড়তে:

>>> import pickle
>>> file = open("Fruits.obj",'rb')
>>> object_file = pickle.load(file)

একটি সুন্দর সংস্করণ withবিবৃতি ব্যবহার করা হবে ।

লেখার জন্য:

>>> import pickle
>>> with open('Fruits.obj', 'wb') as fp:
>>>     pickle.dump(banana, fp)

পড়ার জন্য:

>>> import pickle
>>> with open('Fruits.obj', 'rb') as fp:
>>>     banana = pickle.load(fp)

1
আমি আপনার সংস্করণটি ব্যবহার করি যা বিবৃতি সহ ব্যবহার করে এবং আমি এই বার্তাটি পাই: ট্রেসব্যাক (সর্বশেষতম কলটি শেষ): ফাইল "<pyshell # 20>", লাইন 1, <মডুল> মুদ্রণ (কলা কলর) বৈশিষ্ট্যযুক্তি: 'ফল' বস্তুর কোনও 'রঙ' নেই
পিটারস্টোন


6

আপনি ফাইলটি বাইনারি মোডে খুললেন না।

open("Fruits.obj",'rb')

কাজ করা উচিত.

আপনার দ্বিতীয় ত্রুটির জন্য, ফাইলটি সম্ভবত খালি, যার অর্থ আপনি অজান্তে এটি খালি করে ফেলেছেন বা ভুল ফাইল নাম বা কিছু ব্যবহার করেছেন।

(এটি ধরে নিচ্ছে যে আপনি সত্যই আপনার সেশনটি বন্ধ করেছেন If যদি তা না হয় তবে আপনি লেখার এবং পঠনের মধ্যে ফাইলটি বন্ধ করেন নি) এর কারণ এটি।

আমি আপনার কোড পরীক্ষা করেছি এবং এটি কার্যকর হয়।


3

দেখে মনে হচ্ছে আপনি আপনার ক্লাসের উদাহরণগুলি সেশন জুড়ে সংরক্ষণ করতে চান এবং pickleএটি করার একটি শালীন উপায় using তবে, এমন একটি প্যাকেজ রয়েছে kleptoযা ডিকোশনারি ইন্টারফেসে অবজেক্টগুলির সঞ্চয়কে বিমূracts় করে, তাই আপনি বাছাই করা বাছাই করতে পারেন এবং একটি ফাইলে সংরক্ষণ করতে পারেন (নীচে দেখানো হয়েছে), বা বস্তুগুলি বাছাই করতে পারেন এবং সেগুলি একটি ডাটাবেসে সংরক্ষণ করতে পারেন, বা পরিবর্তে আচার ব্যবহার জেসন বা অন্যান্য অনেকগুলি বিকল্প ব্যবহার করুন। সুন্দর জিনিসটি kleptoহ'ল একটি সাধারণ ইন্টারফেসের বিমূর্ততা এনে এটিকে সহজ করে তোলে যাতে কোনও ফাইলকে বাছাইয়ের মাধ্যমে কীভাবে সংরক্ষণ করতে হয় তার নিম্ন-স্তরের বিশদটি আপনাকে মনে রাখতে হবে না বা অন্যথায়।

দ্রষ্টব্য যে এটি গতিযুক্ত যুক্ত শ্রেণীর বৈশিষ্ট্যগুলির জন্য কাজ করে, যা আচারটি করতে পারে না ...

dude@hilbert>$ python
Python 2.7.6 (default, Nov 12 2013, 13:26:39) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from klepto.archives import file_archive 
>>> db = file_archive('fruits.txt')
>>> class Fruits: pass
... 
>>> banana = Fruits()
>>> banana.color = 'yellow'
>>> banana.value = 30
>>> 
>>> db['banana'] = banana 
>>> db.dump()
>>> 

তারপরে আমরা পুনরায় চালু করব ...

dude@hilbert>$ python
Python 2.7.6 (default, Nov 12 2013, 13:26:39) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from klepto.archives import file_archive
>>> db = file_archive('fruits.txt')
>>> db.load()
>>> 
>>> db['banana'].color
'yellow'
>>> 

Klepto পাইথন 2 এবং পাইথন 3 এ কাজ করে।

কোডটি এখানে পান: https://github.com/uqfoundation


1

আপনার জন্য কাজটি করতে আপনি যে কোনও ক্যাশে ব্যবহার করতে পারেন । ধরে নিই আপনার একটি ফাংশন রয়েছে myfuncযা উদাহরণটি তৈরি করে:

from anycache import anycache

class Fruits:pass

@anycache(cachedir='/path/to/your/cache')    
def myfunc()
    banana = Fruits()
    banana.color = 'yellow'
    banana.value = 30
return banana

অ্যানিচি myfuncপ্রথমবার কল করে এবং ফাইলের cachedirনাম হিসাবে কোনও অনন্য সনাক্তকারী (ফাংশনের নাম এবং আর্গুমেন্টের উপর নির্ভর করে) ব্যবহার করে কোনও ফাইলকে ফলাফল বাছায় । যে কোনও পরপর রান করে, আচারযুক্ত বস্তুটি লোড হয়।

তাহলে cachedirপাইথন রানে মধ্যে সংরক্ষিত হয়, জরা বস্তুর পূর্ববর্তী পাইথন রান থেকে নেওয়া হয়।

ফাংশন যুক্তিগুলিও আমলে নেওয়া হয়। একটি রিফ্যাক্টরড বাস্তবায়ন একইভাবে কাজ করে:

from anycache import anycache

class Fruits:pass

@anycache(cachedir='/path/to/your/cache')    
def myfunc(color, value)
    fruit = Fruits()
    fruit.color = color
    fruit.value = value
return fruit
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.