ما هو الفرق بين المخلل والرفاق؟
-
29-09-2019 - |
سؤال
أنا أتعلم عن التسلسل الكائن لأول مرة. حاولت القراءة و "googling" للاختلافات في الوحدات النمطية المخللة والرفوف لكنني لست متأكدًا من فهمه. متى تستخدم أي واحد؟ يمكن أن يحول المخلل كل كائن بيثون إلى دفق من البايتات التي يمكن استمرارها في ملف. ثم لماذا نحتاج إلى وحدة الرفى؟ أليس المخلل أسرع؟
المحلول
pickle
هو لتسلسل بعض الكائنات (أو الكائنات) باعتبارها bytestream واحدة في ملف.
shelve
يبني فوق pickle
ويقوم بتنفيذ قاموس تسلسل حيث يتم انخفاض الكائنات ، ولكن مرتبطًا بمفتاح (بعض السلسلة) ، بحيث يمكنك تحميل ملف البيانات الخاص بك والوصول إلى كائناتك المخللة عبر المفاتيح. قد يكون هذا أكثر ملاءمة لو أن تسلسل العديد من الأشياء.
فيما يلي مثال على الاستخدام بين الاثنين. (يجب أن تعمل في أحدث إصدارات Python 2.7 و Python 3.x).
pickle
مثال
import pickle
integers = [1, 2, 3, 4, 5]
with open('pickle-example.p', 'wb') as pfile:
pickle.dump(integers, pfile)
هذا سوف تفريغ integers
قائمة بملف ثنائي يسمى pickle-example.p
.
حاول الآن قراءة الملف المخلل مرة أخرى.
import pickle
with open('pickle-example.p', 'rb') as pfile:
integers = pickle.load(pfile)
print integers
يجب أن يخرج أعلاه [1, 2, 3, 4, 5]
.
shelve
مثال
import shelve
integers = [1, 2, 3, 4, 5]
# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'c')) as shelf:
with shelve.open('shelf-example', 'c') as shelf:
shelf['ints'] = integers
لاحظ كيفية إضافة كائنات إلى الرف عبر الوصول الذي يشبه القاموس.
اقرأ الكائن مرة أخرى برمز مثل ما يلي:
import shelve
# If you're using Python 2.7, import contextlib and use
# the line:
# with contextlib.closing(shelve.open('shelf-example', 'r')) as shelf:
with shelve.open('shelf-example', 'r') as shelf:
for key in shelf.keys():
print(repr(key), repr(shelf[key])))
سيكون الإخراج 'ints', [1, 2, 3, 4, 5]
.