وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

مقدمه ای بر ماژول Pickle Python

0 2
زمان لازم برای مطالعه: 6 دقیقه


معرفی

اسید شویی یک روش محبوب برای نگهداری مواد غذایی است. مطابق با ویکیپدیا، همچنین یک روش بسیار باستانی است – اگرچه منشأ ترشی ناشناخته است، بین النهرینان باستان احتمالاً از آن استفاده می کردند. process 4400 سال پیش با قرار دادن یک محصول در محلول خاصی می توان ماندگاری آن را به شدت افزایش داد. به عبارت دیگر، این روشی است که به ما امکان می دهد مواد غذایی را برای مصرف بعدی ذخیره کنیم.

اگر شما یک توسعه دهنده پایتون هستید، ممکن است روزی به راهی برای ذخیره اشیاء پایتون خود برای استفاده بعدی نیاز پیدا کنید. خوب، اگر به شما بگویم، می توانید اشیاء پایتون را هم ترشی کنید، چه می شود؟

سریال سازی

سریال سازی یک است process تبدیل اشیا یا ساختارهای داده به جریان های بایتی یا رشته ها جریان بایت جریانی از بایت است – یک بایت از 8 بیت صفر و یک تشکیل شده است. سپس این جریان های بایتی می توانند به راحتی ذخیره یا منتقل شوند. این به توسعه دهندگان اجازه می دهد تا به عنوان مثال، داده های پیکربندی یا پیشرفت کاربر را ذخیره کرده و سپس آن را ذخیره کنند (روی دیسک یا در پایگاه داده) یا آن را به مکان دیگری ارسال کنید.

اشیاء پایتون را نیز می توان با استفاده از یک ماژول به نام سریال کرد ترشی.

یکی از تفاوت های اصلی ترشی اشیاء پایتون با ترشی سبزیجات، تغییر اجتناب ناپذیر و غیرقابل برگشت طعم و بافت ترشی غذا است. در همین حال، اشیاء ترشی پایتون را می توان به راحتی به شکل اولیه خود بازگرداند. این process، به هر حال، در سراسر جهان به عنوان شناخته شده است سریال زدایی.

ترشی (یا سریال سازی به طور کلی) نباید با فشرده سازی اشتباه گرفته شود. هدف از ترشی ترجمه داده ها به فرمتی است که می تواند از RAM به دیسک منتقل شود. فشرده سازی، روی از سوی دیگر، یک است process رمزگذاری داده ها با استفاده از بیت های کمتر (به منظور صرفه جویی در فضای دیسک).

سریال سازی به ویژه در هر نرم افزاری که در آن مهم است که بتوانیم مقداری پیشرفت را ذخیره کنیم مفید است روی دیسک، برنامه را ترک کنید و پس از باز کردن مجدد برنامه، پیشرفت را بارگیری کنید. بازی‌های ویدیویی ممکن است بصری‌ترین مثال از سودمندی سریال‌سازی باشند، اما بسیاری از برنامه‌های دیگر وجود دارند که ذخیره و بارگذاری پیشرفت یا داده‌های کاربر در آنها بسیار مهم است.

پیکل در مقابل JSON

این احتمال وجود دارد که شما در مورد آن شنیده باشید JSON (جاوا اسکریپت Object Notation)، که یک فرمت محبوب است که همچنین به توسعه دهندگان اجازه می دهد اشیاء رمزگذاری شده به عنوان رشته را ذخیره و انتقال دهند. این روش سریال سازی مزایایی نسبت به ترشی دارد. فرمت JSON قابل خواندن توسط انسان، مستقل از زبان و سریعتر از ترشی است.

با این حال، محدودیت های مهمی نیز دارد. مهمتر از همه، به طور پیش فرض، تنها یک زیر مجموعه محدود از انواع داخلی پایتون را می توان با JSON نشان داد. با Pickle، ما به راحتی می توانیم طیف بسیار زیادی از انواع پایتون و مهمتر از همه، کلاس های سفارشی را سریال کنیم. این بدان معناست که ما نیازی به ایجاد یک طرحواره سفارشی نداریم (مانند کاری که برای JSON انجام می دهیم) و سریال سازها و تجزیه کننده های مستعد خطا را بنویسیم. تمام کارهای سنگین با Pickle برای شما انجام می شود.

پیشنهاد می‌کنیم بخوانید:  راهنمای Heaps در پایتون

چه چیزی را می توان ترشی و بدون ترشی کرد

انواع زیر را می توان با استفاده از ماژول Pickle سریالی و غیر سریالی کرد:

  • همه انواع داده های بومی که توسط پایتون پشتیبانی می شوند (بولی، هیچ، اعداد صحیح، شناور، اعداد مختلط، رشته ها، بایت ها، آرایه های بایت)
  • دیکشنری‌ها، مجموعه‌ها، فهرست‌ها و تاپل‌ها – به شرطی که حاوی اشیاء قابل ترشی باشند
  • توابع و کلاس هایی که در سطح بالای یک ماژول تعریف می شوند

مهم است که به یاد داشته باشید که ترشی کردن یک روش سریال‌سازی مستقل از زبان نیست، بنابراین داده‌های ترشی شما را فقط می‌توان با استفاده از Python از حالت ترشی خارج کرد. علاوه بر این، آن است مهم این است که مطمئن شوید که اشیا با استفاده از همان نسخه پایتون ترشی می شوند که قرار است برای برداشتن ترشی آنها استفاده شود.. مخلوط کردن نسخه های پایتون، در این مورد، می تواند مشکلات زیادی را ایجاد کند.

علاوه بر این، توابع بر اساس ارجاعات نامشان ترشی می شوند و نه با ارزششان. ترشی به دست آمده حاوی اطلاعاتی نیست روی کد یا ویژگی های تابع بنابراین، باید مطمئن شوید که محیطی که عملکرد در آن ترشی نشده است، قادر است import کارکرد. به عبارت دیگر، اگر یک تابع را ترشی کنیم و سپس آن را در محیطی که یا تعریف نشده یا وارد نشده است از حالت Pickel خارج کنیم، یک استثنا ایجاد می شود.

همچنین توجه به این نکته بسیار مهم است که از اشیای ترشی می توان به روش های بدخواهانه استفاده کرد. به عنوان مثال، حذف داده ها از یک منبع نامعتبر می تواند منجر به اجرای یک کد مخرب شود.

چیدن لیست پایتون

مثال بسیار ساده زیر اصول استفاده از ماژول Pickle را نشان می دهد پایتون 3:

import pickle

test_list = ('cucumber', 'pumpkin', 'carrot')

with open('test_pickle.pkl', 'wb') as pickle_out:
    pickle.dump(test_list, pickle_out)

اول، ما باید import را pickle ماژول که در خط 1 انجام می شود. در خط 3 یک لیست سه عنصری ساده تعریف می کنیم که ترشی می شود.

در خط 5 بیان می کنیم که نام فایل ترشی خروجی ما خواهد بود test_pickle.pkl. با استفاده از wb گزینه، به برنامه می گوییم که می خواهیم بنویسیم (w) داده های باینری (b) در داخل آن (چون می خواهیم یک جریان بایت ایجاد کنیم). توجه داشته باشید که pkl پسوند ضروری نیست – ما از آن در این آموزش استفاده می کنیم زیرا این پسوند موجود در اسناد پایتون است.

در خط 6 ما از pickle.dump() روشی برای ترشی لیست تست ما و ذخیره آن در داخل test_pickle.pkl فایل.

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

حذف کردن لیست پایتون

حال بیایید محتویات فایل ترشی تست را از حالت ترشی بردارید و شیء خود را به شکل اصلی خود برگردانیم.

import pickle

with open('test_pickle.pkl', 'rb') as pickle_in:
    unpickled_list = pickle.load(pickle_in)

print(unpickled_list)

همانطور که می بینید، این روش پیچیده تر از زمانی نیست که شی را ترشی می کنیم. در خط 3 ما را باز می کنیم test_pickle.pkl دوباره فایل کنید، اما این بار هدف ما خواندن (r) داده های باینری (b) در آن ذخیره می شود.

پیشنهاد می‌کنیم بخوانید:  آموزش PyGame – چگونه یک بازی Alien Abduction بسازیم

بعد، در خط 5، ما استفاده می کنیم pickle.load() روشی برای حذف لیست ما و ذخیره آن در unpickled_list متغیر.

پس می توانید print محتویات لیست را برای خودتان ببینید که با لیستی که در مثال قبلی ترشی کردیم یکسان است. در اینجا خروجی اجرای کد بالا آمده است:

$ python unpickle.py
('cucumber', 'pumpkin', 'carrot')

ترشی و برداشتن ترشی اشیاء سفارشی

همانطور که قبلا ذکر کردم، با استفاده از Pickle، می توانید اشیاء سفارشی خود را سریال کنید. به مثال زیر دقت کنید:

import pickle

class Veggy():
    def __init__(self):
        self.color = ''
    def set_color(self, color):
        self.color = color

cucumber = Veggy()
cucumber.set_color('green')

with open('test_pickle.pkl', 'wb') as pickle_out:
    pickle.dump(cucumber, pickle_out)

with open('test_pickle.pkl', 'rb') as pickle_in:
    unpickled_cucumber = pickle.load(pickle_in)

print(unpickled_cucumber.color)

همانطور که می بینید، این مثال تقریباً به سادگی نمونه قبلی است. ما بین خطوط 3 و 7 یک کلاس ساده تعریف می کنیم که شامل یک ویژگی و یک متد است که این ویژگی را تغییر می دهد. در خط 9 یک نمونه از آن کلاس ایجاد می کنیم و آن را در آن ذخیره می کنیم cucumber متغیر، و در خط 10 ویژگی آن را تنظیم می کنیم color به “سبز”.

سپس، دقیقاً با استفاده از عملکردهای مشابه در مثال قبلی، تازه ایجاد شده خود را ترشی و برداشته می کنیم cucumber هدف – شی. با اجرای کد بالا خروجی زیر حاصل می شود:

$ python unpickle_custom.py
green

به یاد داشته باشید که ما فقط می‌توانیم شی را در محیطی که کلاس در آن است، از حالت انتخاب خارج کنیم Veggy یا تعریف شده یا وارداتی است. اگر یک اسکریپت جدید ایجاد کنیم و سعی کنیم بدون وارد کردن آن، شی را از حالت انتخاب خارج کنیم Veggy کلاس، یک “AttributeError” دریافت خواهیم کرد. برای مثال اسکریپت زیر را اجرا کنید:

import pickle

with open('test_pickle.pkl', 'rb') as pickle_in:
    unpickled_cucumber = pickle.load(pickle_in)

print(unpickled_cucumber.color)

در خروجی اسکریپت بالا، خطای زیر را مشاهده خواهید کرد:

$ python unpickle_simple.py
Traceback (most recent call last):
  File "<pyshell#40>", line 2, in <module>
    unpickled_cucumber = pickle.load(pickle_in)
AttributeError: Can't get attribute 'Veggy' روی <module '__main__' (built-in)>

نتیجه

همانطور که می بینید، به لطف ماژول Pickle، سریال سازی اشیاء پایتون بسیار ساده است. در مثال‌هایمان، ما یک لیست ساده پایتون را انتخاب کردیم – اما شما می‌توانید دقیقاً از همین روش برای ذخیره طیف وسیعی از انواع داده‌های پایتون استفاده کنید، به شرطی که مطمئن شوید که اشیاء شما فقط دارای سایر اشیاء قابل ترشی هستند.

Pickling دارای معایبی است که بزرگترین آنها ممکن است این واقعیت باشد که شما فقط می توانید داده های خود را با استفاده از Python حذف کنید – اگر به یک راه حل بین زبانی نیاز دارید، JSON قطعا گزینه بهتری است. و در نهایت، به یاد داشته باشید که از ترشی ها می توان برای حمل کدی استفاده کرد که لزوما نمی خواهید آن را اجرا کنید. مانند غذاهای ترشی، تا زمانی که ترشی های خود را از منابع معتبر تهیه کنید، باید خوب باشید.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-27 02:27:02

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید