سطح مقدماتی (Beginner Level)
ماژول pickle در پایتون برای سریالسازی (Serialization) و دیسریالسازی (Deserialization) استفاده میشود. به زبان ساده، سریالسازی یعنی تبدیل یک شیء پایتون (مانند لیست، دیکشنری یا کلاس) به یک جریان بایت (Byte Stream) تا بتوان آن را در فایل ذخیره کرد یا از طریق شبکه فرستاد.
برخلاف JSON که فقط متن را میفهمد، pickle مخصوص پایتون است و میتواند تقریباً هر نوع دادهای (حتی توابع و کلاسها) را ذخیره کند.
توابع اصلی: dumps و loads
برای کار با بایتها در حافظه (بدون فایل) از این دو تابع استفاده میکنیم:
dumps: تبدیل شیء به بایت.loads: تبدیل بایت به شیء اصلی.
کار با فایلها (dump و load)
برای ذخیره مستقیم در فایل، باید فایل را در حالت باینری (wb برای نوشتن و rb برای خواندن) باز کنید.
# Example 2: Saving to a file (Static)
import pickle
my_list = [1, 2, 3, "Python"]
# ذخیره در فایل (Write Binary)
with open('data.pkl', 'wb') as file:
pickle.dump(my_list, file)
# خواندن از فایل (Read Binary)
with open('data.pkl', 'rb') as file:
loaded_list = pickle.load(file)
print(loaded_list)
سطح پیشرفته (Professional Level)
در سطح حرفهای، باید با محدودیتها، خطرات امنیتی و نحوه شخصیسازی رفتار pickle در کلاسهای پیچیده آشنا باشید.
1. خطر امنیتی (Security Warning)
بسیار مهم: هرگز دادههای pickle شده را از منبع ناشناس (مثلاً ورودی کاربر در وب) بارگذاری (load) نکنید.
ماژول pickle میتواند کدهای مخرب را هنگام دیسریالسازی اجرا کند. برای انتقال داده امن بین زبانهای مختلف یا محیطهای ناامن، همیشه از JSON استفاده کنید.
2. مدیریت وضعیت کلاسها (__getstate__)
گاهی اوقات نمیخواهید تمام خصوصیات یک کلاس ذخیره شود (مثلاً اتصال دیتابیس یا یک فایل باز). با متدهای جادویی __getstate__ و __setstate__ میتوانید کنترل کنید چه چیزی ذخیره و چگونه بازیابی شود.
3. فشردهسازی Pickle
فایلهای پیکل شده میتوانند حجیم باشند. یک الگوی حرفهای استفاده از ماژول gzip یا bz2 همراه با pickle برای کاهش حجم فایل است.
# Example 4: Compressed Pickle (Static)
import pickle
import gzip
large_data = [i for i in range(1000000)]
# نوشتن فشرده
with gzip.open('data.pkl.gz', 'wb') as f:
pickle.dump(large_data, f)
# خواندن فشرده
with gzip.open('data.pkl.gz', 'rb') as f:
restored = pickle.load(f)