آموزش ماژول pickle در پایتون

June 2020

بعنوان یک توسعه دهنده ، ممکن است شما نیاز داشته باشید که یک آبجکت پیچیده را از طریق شبکه بفرستید یا وضعیت داخلی آبجکت‌های خود را برای استفاده بعدی در دیسک یا دیتابیس ذخیره کنید. برای تحقق این امر می توانید از فرایندی به نام serialization استفاده کنید که به لطف ماژول pickle پایتون به طور کامل توسط کتابخانه استاندارد پشتیبانی می شود.

 

فرایند serialization روشی برای تبدیل ساختار داده به فرم خطی است که می تواند از طریق شبکه ذخیره یا منتقل شود. به روند معکوس، که یک فرم خطی را می گیرد و آنرا دوباره به آبجکت تبدیل می کند را deserialization میگویند. serialization در بسیاری از موقعیت های مختلف قابل استفاده است. یکی از رایج ترین استفاده ها صرفه جویی در وضعیت شبکه عصبی بعد از مرحله آموزش است تا بتوانید بعداً از آن استفاده کنید بدون اینکه مجدداً تمرین را دوباره انجام دهید.

 

داخل ماژول ترشی پایتون

ماژول pickle پایتون اساساً از چهار متد تشکیل شده است:

pickle.dump(obj, file, protocol=None, *, fix_imports=True, buffer_callback=None)

pickle.dumps(obj, protocol=None, *, fix_imports=True, buffer_callback=None)

pickle.load(file, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)

pickle.loads(bytes_object, *, fix_imports=True, encoding="ASCII", errors="strict", buffers=None)

دو روش اول در طی فرآیند pickling استفاده می شود و دو روش دیگر در حین unpickling. تنها تفاوت بین dump() و dumps() در این است که اولی فایلی را ایجاد می کند که حاوی نتیجه serialization است ، در حالی که دوم یک string را برمی گرداند.

 

در مثال زیر میبینید که چطور با استفاده از ماژول pickle میتوان یک کلاس را serialize کرد و یک رشته ساده را دریافت کرد. بعد از انتخاب کلاس ، می توانید مقدار ویژگیهای آن را بدون تأثیرگذاری روی رشته pickle تغییر دهید. سپس می توانید رشته pickle را در یک متغیر دیگر جدا کنید و یک نسخه دقیق از کلاس pickle قبلی را داشته باشید.

# pickling.py
import pickle

class example_class:
    a_number = 35
    a_string = "hey"
    a_list = [1, 2, 3]
    a_dict = {"first": "a", "second": 2, "third": [1, 2, 3]}
    a_tuple = (22, 23)

my_object = example_class()

my_pickled_object = pickle.dumps(my_object)  # Pickling the object
print(f"This is my pickled object:\n{my_pickled_object}\n")

my_object.a_dict = None

my_unpickled_object = pickle.loads(my_pickled_object)  # Unpickling the object
print(f"This is a_dict of the unpickled object:\n{my_unpickled_object.a_dict}\n")

در مثال بالا چندین آبجکت مختلف ایجاد می کنید و با pickle آنها را serialize می کنید. و نتیجه به شکل زیر خواهد بود:

$ python pickling.py
This is my pickled object:
b'\x80\x03c__main__\nexample_class\nq\x00)\x81q\x01.'

This is a_dict of the unpickled object:
{'first': 'a', 'second': 2, 'third': [1, 2, 3]}

 

ارسال نظر

اگر قراره سوالی بپرسید که داخلش کد هست، بهتره از کدتون عکس بگیرید و به ایمیلی که پایین نوشتم بفرستید