আমি ডিক বাঁচাতে কীভাবে আচার ব্যবহার করতে পারি?


370

পাইথন ডক্স যে তথ্য দেয় তা আমি দেখেছি তবে আমি এখনও কিছুটা বিভ্রান্ত। কেউ কি নমুনা কোড পোস্ট করতে পারে যা একটি নতুন ফাইল লিখতে পারে তবে এর মধ্যে ডিকশনারি ফেলে দেওয়ার জন্য আচার ব্যবহার করতে পারে?


5
এর মাধ্যমে পড়ুন: ডঘহেলম্যান / পাইমোটডব্লিউ / পিক্লে এবং যখন আপনার একটি নির্দিষ্ট প্রশ্ন প্রয়োজন হবে তখন ফিরে আসুন
পাইফ্যাঙ্ক

2
-1 পূর্ববর্তী মন্তব্য দেখুন। চেষ্টা করে দেখুন তারপরে, যদি এটি কাজ না করে (এটি সর্বদা চলবে না), তবে একটি নির্দেশিত প্রশ্ন তৈরি করা যেতে পারে (একটি অনুমান বা দুটি পরীক্ষা করা যেতে পারে এবং সম্ভবত "অন্যদের কাছে প্রশ্ন জিজ্ঞাসার আগে" অনুসন্ধান করা হয় ")। যেমন একটি সিনট্যাক্স ত্রুটি ছিল? একটি ব্যতিক্রম? মানগুলি কি ফিরে এসেছিল?

1
পাইগেম থেকে তথ্য বাঁচাতে আমি এটি ব্যবহার করার চেষ্টা করছি। আমি উপরের তথ্য ব্যবহার করেছেন এবং আমার কোডটির এই মত দেখায়:
Chachmu

নাম = কাঁচা_পিন্ড ('ইনপুট ফাইলের নাম:') টিএফ = খোলা (নাম + '। পিকেএল', 'ডাব্লু বিবি') পিকেল.ডাম্প (মোট, টিএফ) tf.close ()
চাচমু

2
পৃষ্ঠতল বস্তুগুলি কীভাবে আচার করা যায় সে সম্পর্কে আপনার একটি নতুন প্রশ্ন জিজ্ঞাসা করা উচিত
জন লা রুই

উত্তর:


727

এটা চেষ্টা কর:

import pickle

a = {'hello': 'world'}

with open('filename.pickle', 'wb') as handle:
    pickle.dump(a, handle, protocol=pickle.HIGHEST_PROTOCOL)

with open('filename.pickle', 'rb') as handle:
    b = pickle.load(handle)

print a == b

4
@ হুবিসফট: আপনি সরিয়ে ফেললেন কেন pickle.HIGHEST_PROTOCOL?
ব্লেন্ডার

37
@ ব্লেন্ডার: এই স্তরের প্রশ্নের জন্য অপ্রাসঙ্গিক এবং অপ্রয়োজনীয় জটিল - গড় ব্যবহারকারী ডিফল্টগুলির সাথে ঠিকই ঠিক থাকবে।
houbysoft

28
@ হুবিসফট: পাইথন 3 ব্যবহারকারীর পক্ষে সত্য, তবে পাইথন 2-তে, সময় এবং স্থানের জন্য ডিফল্ট প্রোটোকল (0) ব্যবহার করা কেবল অবিশ্বাস্যভাবে অকার্যকরই নয়, তবে এটি আসলে এমন অনেকগুলি জিনিস পরিচালনা করতে পারে না যা প্রোটোকল 2+ ঠিক জরিমানা করে (যেমন নতুন স্টাইল ক্লাস যে ব্যবহার করে __slots__)। আমি বলছি না যে আপনার সর্বদা ব্যবহার করা উচিত HIGHEST_PROTOCOL, তবে আপনি প্রোটোকল 0 বা 1 ব্যবহার করবেন না তা নিশ্চিত করা আসলেই গুরুত্বপূর্ণ।
শ্যাডোএ্যাঞ্জার

11
কী pickle.HIGHEST_PROTOCOLআসলে কি?
বলপয়েন্টবেন

7
@ বালপয়েন্টপেন: এটি পাইথনের আপনার সংস্করণটিকে সমর্থন করে সর্বোচ্চ প্রোটোকল সংস্করণটি তুলেছে
ব্লেন্ডার

92
import pickle

your_data = {'foo': 'bar'}

# Store data (serialize)
with open('filename.pickle', 'wb') as handle:
    pickle.dump(your_data, handle, protocol=pickle.HIGHEST_PROTOCOL)

# Load data (deserialize)
with open('filename.pickle', 'rb') as handle:
    unserialized_data = pickle.load(handle)

print(your_data == unserialized_data)

এর সুবিধাটি HIGHEST_PROTOCOLহ'ল ফাইলগুলি আরও ছোট হয়। এটি মাঝে মধ্যে আনপিকলিং খুব দ্রুত করে তোলে।

গুরুত্বপূর্ণ বিজ্ঞপ্তি : আচার সর্বোচ্চ ফাইলের আকার প্রায় 2 জিবি।

বিকল্প উপায়

import mpu
your_data = {'foo': 'bar'}
mpu.io.write('filename.pickle', data)
unserialized_data = mpu.io.read('filename.pickle')

বিকল্প ফর্ম্যাট

আপনার প্রয়োগের জন্য, নিম্নলিখিতগুলি গুরুত্বপূর্ণ হতে পারে:

  • অন্যান্য প্রোগ্রামিং ভাষা দ্বারা সমর্থন
  • পড়া / লেখার পারফরম্যান্স
  • সংক্ষিপ্ততা (ফাইলের আকার)

আরও দেখুন: ডেটা সিরিয়ালাইজেশন ফর্ম্যাটগুলির তুলনা

আপনি যদি কনফিগারেশন ফাইলগুলি তৈরির পরিবর্তে কোনও উপায় সন্ধান করছেন, আপনি পাইথনে আমার সংক্ষিপ্ত নিবন্ধ কনফিগারেশন ফাইলগুলি পড়তে চাইতে পারেন


1
আমি মনে করি 2GB সীমাটি প্রোটোকল = 4 এবং উচ্চতর দিয়ে মুছে ফেলা হয়েছিল।
কম্পিউটার

28
# Save a dictionary into a pickle file.
import pickle

favorite_color = {"lion": "yellow", "kitty": "red"}  # create a dictionary
pickle.dump(favorite_color, open("save.p", "wb"))  # save it into a file named save.p

# -------------------------------------------------------------
# Load the dictionary back from the pickle file.
import pickle

favorite_color = pickle.load(open("save.p", "rb"))
# favorite_color is now {"lion": "yellow", "kitty": "red"}

1
খোলা () এর পরে কি কোনও ঘনিষ্ঠ () ব্যবহার করা দরকার?
PlsWork

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

14

সাধারণভাবে, পিকিং dictব্যর্থ হবে যদি না আপনার কাছে স্ট্রিং এবং পূর্ণসংখ্যার মতো কেবল সাধারণ বস্তু থাকে।

Python 2.7.9 (default, Dec 11 2014, 01:21:43) 
[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 numpy import *
>>> type(globals())     
<type 'dict'>
>>> import pickle
>>> pik = pickle.dumps(globals())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
    Pickler(file, protocol).dump(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems
    save(v)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 306, in save
    rv = reduce(self.proto)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/copy_reg.py", line 70, in _reduce_ex
    raise TypeError, "can't pickle %s objects" % base.__name__
TypeError: can't pickle module objects
>>> 

এমনকি সত্যই সরল dictপ্রায়শই ব্যর্থ হয়। এটি কেবল বিষয়বস্তুর উপর নির্ভর করে।

>>> d = {'x': lambda x:x}
>>> pik = pickle.dumps(d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 1374, in dumps
    Pickler(file, protocol).dump(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 224, in dump
    self.save(obj)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 663, in _batch_setitems
    save(v)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/pickle.py", line 748, in save_global
    (obj, module, name))
pickle.PicklingError: Can't pickle <function <lambda> at 0x102178668>: it's not found as __main__.<lambda>

তবে, আপনি যদি আরও ভাল সিরিয়ালাইজার ব্যবহার করেন dillবা cloudpickle, তারপরে বেশিরভাগ অভিধান বেছে নেওয়া যেতে পারে:

>>> import dill
>>> pik = dill.dumps(d)

অথবা আপনি যদি dictকোনও ফাইলের মধ্যে সংরক্ষণ করতে চান ...

>>> with open('save.pik', 'w') as f:
...   dill.dump(globals(), f)
... 

পরবর্তী উদাহরণটি এখানে পোস্ট করা অন্যান্য ভাল উত্তরের সাথে একরকম (যা ভালভাবে বিষয়বস্তুগুলির পিকলেবিলিটি অবহেলা করা বাদ দেয় dict)।


9
>>> import pickle
>>> with open("/tmp/picklefile", "wb") as f:
...     pickle.dump({}, f)
... 

সাধারণত সিপিক্ল বাস্তবায়ন ব্যবহার করা ভাল

>>> import cPickle as pickle
>>> help(pickle.dump)
Help on built-in function dump in module cPickle:

dump(...)
    dump(obj, file, protocol=0) -- Write an object in pickle format to the given file.

    See the Pickler docstring for the meaning of optional argument proto.

6

আপনি যদি কেবল একটি একক ফাইলে ডিকটি সঞ্চয় করতে চান তবে এটির pickleমতো ব্যবহার করুন

import pickle

a = {'hello': 'world'}

with open('filename.pickle', 'wb') as handle:
    pickle.dump(a, handle)

with open('filename.pickle', 'rb') as handle:
    b = pickle.load(handle)

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

from anycache import anycache

@anycache(cachedir='path/to/files')
def myfunc(hello):
    return {'hello', hello}

অ্যানিচি ক্যাশে myfuncবিভিন্ন ফাইলগুলিতে যুক্তির উপর নির্ভর করে বিভিন্ন ফলাফল সঞ্চয় করে cachedirএবং তাদের পুনরায় লোড করে।

আরও তথ্যের জন্য ডকুমেন্টেশন দেখুন ।




-8

আমি পিকিং বিভ্রান্তি পেয়েছি (সম্ভবত আমি মোটা কারণ)। আমি দেখতে পেয়েছি যে এটি কাজ করে:

myDictionaryString=str(myDictionary)

যা আপনি তারপর একটি পাঠ্য ফাইলে লিখতে পারেন। আমি ড্যাড ফাইলে পূর্ণসংখ্যা লিখতে বলায় ত্রুটি হচ্ছিল বলে আমি আচার ব্যবহারের চেষ্টা ছেড়ে দিয়েছি। আমি আচার ব্যবহার না করার জন্য ক্ষমা চাইছি।


1
-১: এটি যেমনটি রয়েছে (যেমন, একটি অজগর বস্তু) সেভ করা উচিত যাতে এটি আবার চালানোর জন্য অপেক্ষা না করে আমরা পরে এটি পড়তে পারি। পিকেল আমাদের পড়ার জন্য পাইথন অবজেক্টটি সংরক্ষণ করতে দেয়।
Catbuilts

এটি নিম্ন মানের পোস্টের কাতারে ফিরে আসা একটি পুরানো উত্তর .. এটি খুব সহজ সমাধান নয় যে এটি সম্ভবত খুব সাধারণ অভিধানের জন্য কাজ করে তবে এটির পক্ষে dictঅবজেক্টের আরও গভীরতা থাকতে পারে (যা কেবলমাত্র মুদ্রিত হতে পারে নাম) এবং / অথবা কোনও বা সম্পূর্ণ স্ট্রিং প্রতিনিধিত্ব ছাড়াই অবজেক্টগুলি।
ti7

1
@ টিআই 7 এর বক্তব্যটি যুক্ত করতে, উত্তরের প্রযুক্তিগত যোগ্যতা নির্বিশেষে, এই পোস্টটি ভিএলকিউ নয়। যদি কারও মনে হয় যে এই উত্তরটি সঠিক নয়, তবে তাদের ভিওএলকিউ হিসাবে পতাকাঙ্কিত করবেন না কেন, এবং তাদের মন্তব্য কমিয়ে দেওয়া উচিত।
ইজোশুয়াস - মনিকা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.