از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
مقدمه ای بر ماژول Pickle Python
سرفصلهای مطلب
معرفی
اسید شویی یک روش محبوب برای نگهداری مواد غذایی است. مطابق با ویکیپدیا، همچنین یک روش بسیار باستانی است – اگرچه منشأ ترشی ناشناخته است، بین النهرینان باستان احتمالاً از آن استفاده می کردند. process 4400 سال پیش با قرار دادن یک محصول در محلول خاصی می توان ماندگاری آن را به شدت افزایش داد. به عبارت دیگر، این روشی است که به ما امکان می دهد مواد غذایی را برای مصرف بعدی ذخیره کنیم.
اگر شما یک توسعه دهنده پایتون هستید، ممکن است روزی به راهی برای ذخیره اشیاء پایتون خود برای استفاده بعدی نیاز پیدا کنید. خوب، اگر به شما بگویم، می توانید اشیاء پایتون را هم ترشی کنید، چه می شود؟
سریال سازی
سریال سازی یک است process تبدیل اشیا یا ساختارهای داده به جریان های بایتی یا رشته ها جریان بایت جریانی از بایت است – یک بایت از 8 بیت صفر و یک تشکیل شده است. سپس این جریان های بایتی می توانند به راحتی ذخیره یا منتقل شوند. این به توسعه دهندگان اجازه می دهد تا به عنوان مثال، داده های پیکربندی یا پیشرفت کاربر را ذخیره کرده و سپس آن را ذخیره کنند (روی دیسک یا در پایگاه داده) یا آن را به مکان دیگری ارسال کنید.
اشیاء پایتون را نیز می توان با استفاده از یک ماژول به نام سریال کرد ترشی.
یکی از تفاوت های اصلی ترشی اشیاء پایتون با ترشی سبزیجات، تغییر اجتناب ناپذیر و غیرقابل برگشت طعم و بافت ترشی غذا است. در همین حال، اشیاء ترشی پایتون را می توان به راحتی به شکل اولیه خود بازگرداند. این process، به هر حال، در سراسر جهان به عنوان شناخته شده است سریال زدایی.
ترشی (یا سریال سازی به طور کلی) نباید با فشرده سازی اشتباه گرفته شود. هدف از ترشی ترجمه داده ها به فرمتی است که می تواند از RAM به دیسک منتقل شود. فشرده سازی، روی از سوی دیگر، یک است process رمزگذاری داده ها با استفاده از بیت های کمتر (به منظور صرفه جویی در فضای دیسک).
سریال سازی به ویژه در هر نرم افزاری که در آن مهم است که بتوانیم مقداری پیشرفت را ذخیره کنیم مفید است روی دیسک، برنامه را ترک کنید و پس از باز کردن مجدد برنامه، پیشرفت را بارگیری کنید. بازیهای ویدیویی ممکن است بصریترین مثال از سودمندی سریالسازی باشند، اما بسیاری از برنامههای دیگر وجود دارند که ذخیره و بارگذاری پیشرفت یا دادههای کاربر در آنها بسیار مهم است.
پیکل در مقابل JSON
این احتمال وجود دارد که شما در مورد آن شنیده باشید JSON (جاوا اسکریپت Object Notation)، که یک فرمت محبوب است که همچنین به توسعه دهندگان اجازه می دهد اشیاء رمزگذاری شده به عنوان رشته را ذخیره و انتقال دهند. این روش سریال سازی مزایایی نسبت به ترشی دارد. فرمت JSON قابل خواندن توسط انسان، مستقل از زبان و سریعتر از ترشی است.
با این حال، محدودیت های مهمی نیز دارد. مهمتر از همه، به طور پیش فرض، تنها یک زیر مجموعه محدود از انواع داخلی پایتون را می توان با JSON نشان داد. با Pickle، ما به راحتی می توانیم طیف بسیار زیادی از انواع پایتون و مهمتر از همه، کلاس های سفارشی را سریال کنیم. این بدان معناست که ما نیازی به ایجاد یک طرحواره سفارشی نداریم (مانند کاری که برای JSON انجام می دهیم) و سریال سازها و تجزیه کننده های مستعد خطا را بنویسیم. تمام کارهای سنگین با Pickle برای شما انجام می شود.
چه چیزی را می توان ترشی و بدون ترشی کرد
انواع زیر را می توان با استفاده از ماژول 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
) در آن ذخیره می شود.
بعد، در خط 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