python কিভাবে আমি একটি সুর সংরক্ষণ করতে আচমকা ব্যবহার করতে পারেন?




dictionary pickle (8)

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


আমি বিরক্তিকর pickling খুঁজে পেয়েছি (সম্ভবত আমি পুরু কারণ)। আমি এই কাজ করে, যদিও:

myDictionaryString=str(myDictionary)

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


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

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

>>> 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.

import pickle

dictobj = {'Jack' : 123, 'John' : 456}

filename = "/foldername/filestore"

fileobj = open(filename, 'wb')

pickle.dump(dictobj, fileobj)

fileobj.close()

সাধারনত, স্ট্রিং এবং ইন্টিজারের মতো, এতে কেবলমাত্র সাধারণ বস্তু থাকা না থাকা পর্যন্ত একটি dict pickling ব্যর্থ হয়।

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 মত একটি ভাল সিরিয়ালাইজার ব্যবহার করেন, তবে বেশিরভাগ cloudpickle যেতে পারে:

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

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

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

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


আপনি যদি শুধুমাত্র একটি ফাইলের মধ্যে স্বতন্ত্র সংরক্ষণ করতে চান, তবে এর মতো ইঞ্চি ব্যবহার করুন

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)

আপনি যদি আরো জটিল তথ্য ক্যাশিং এবং সংরক্ষণের জন্য একাধিক ফাইল সংরক্ষণ এবং পুনরুদ্ধার করতে চান তবে anycache ব্যবহার anycache । এটা আপনি pickle চারপাশে প্রয়োজন অন্যান্য উপাদান

from anycache import anycache

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

Anycache বিভিন্ন myfunc ফলাফল সংরক্ষণ করে যা myfunc বিভিন্ন ফাইলগুলির আর্গুমেন্টের উপর নির্ভর করে এবং পুনরায় লোড করে।

আরও বিস্তারিত জানার জন্য ডকুমেন্টেশন দেখুন।


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 সুবিধাগুলি ফাইলগুলি ছোট হয়ে যায়। এই কখনও কখনও অনেক দ্রুত unpickling করে তোলে।

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

বিকল্প উপায়

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

বিকল্প বিন্যাস

  • সিএসভি: সুপার সহজ বিন্যাস ( পড়া এবং লিখুন )
  • JSON: মানুষের পঠনযোগ্য তথ্য লেখার জন্য চমৎকার; খুব সাধারণভাবে ব্যবহৃত ( পড়া এবং লিখুন )
  • YAML: YAML হল JSON এর একটি সুপারসেট, তবে পড়তে সহজ ( পড় এবং লিখুন , JSON এবং YAML এর তুলনা )
  • আচমকা: একটি পাইথন সিরিয়ালাইজেশন বিন্যাস ( পড়া এবং লিখুন )
  • MessagePack ( পাইথন প্যাকেজ ): আরও কমপ্যাক্ট উপস্থাপনা ( পড়া এবং লিখুন )
  • HDF5 ( পাইথন প্যাকেজ ): ম্যাট্রিক্সের জন্য চমৎকার ( পড়া এবং লিখুন )
  • এক্সএমএল: খুব উপস্থিত * sigh * ( read এবং write )

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

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

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

আপনি যদি কনফিগারেশন ফাইলগুলি তৈরি করার উপায় খুঁজছেন তবে আপনি পাইথনটিতে আমার ছোট নিবন্ধ কনফিগারেশন ফাইল পড়তে চাইতে পারেন


# 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"}

একটি পাইলন ডেটাতে একটি পাইথন ডেটা (উদাহরণস্বরূপ অভিধান) ডাম্প করার সহজ উপায়।

import pickle

your_dictionary = {}

pickle.dump(your_dictionary, open('pickle_file_name.p', 'wb'))




pickle