9.1 pickle
ilə tanışlıq
pickle
modulu demək olar ki, istənilən Python obyektini fayla və ya sətirə saxlamağa, sonra isə onu ilkin vəziyyətinə qaytarmağa imkan verir. pickle
bir çox məlumat növünü, o cümlədən istifadəçi siniflərinin obyektlərini dəstəkləyir və obyektlərin bayt formatına çevrilməsi və geriyə qaytarılması prosesini avtomatlaşdırır.
pickle
modulunun əsas funksiyaları
- Fayla obyektin oxunması və yazılması
-
pickle.dump(obj, file)
: Obyektiobj
serialize edir və onu açılmışfile
faylına yazır. -
pickle.load(file)
:file
faylından oxuyur və obyekti deserializasiya edir.
-
- Obyekti bayt massivi ilə oxumaq və yazmaq
-
pickle.dumps(obj)
: Objektiobj
serialize edir və onu bayt obyekt kimi geri qaytarır. -
pickle.loads(bytes)
: Obyekti bayt obyektindən deserializasiya edir.
-
Aşağıda bu funksiyaları bir az daha ətraflı nəzərdən keçirəcəyik:
9.2 Fayla seriyalaşdırma
Fayla seriyalaşdırmanın əsas addımları:
- Faylı bayt yazma rejimində açmaq
(wb)
. - Obyekti seriyalaşdırmaq üçün istifadə edirik
pickle.dump(obj, file)
. - Obyekti deserializasiya etmək üçün istifadə edirik
pickle.load(file)
. - Faylı bağlamaq.
Obyektin fayla seriyalaşdırılması və deserializasiya edilməsi
Əslində pickle
üçün nəyi seriyalaşdırmağın fərqi yoxdur. Məsələn, siyahının seriyalaşdırılması belə görünür:
import pickle
data = [1, 2, 3, 4, 5]
# Siyahını fayla seriyalaşdırma
with open('list.pkl', 'wb') as file:
pickle.dump(data, file)
# Siyahını fayldan deserializasiya etmə
with open('list.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Çıxış: [1, 2, 3, 4, 5]
Bu isə obyektin (sözlük) seriyalaşdırılması belə görünür:
import pickle
# Seriyalaşdırma üçün obyekt nümunəsi
data = {'name': 'Alice', 'age': 30, 'is_student': False}
# Obyekti fayla seriyalaşdırma
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
# Obyekti fayldan deserializasiya etmə
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data) # Çıxış: {'name': 'Alice', 'age': 30, 'is_student': False}
Obyekti yadda saxlamaq istəyiriksə — dump()
çağırırıq, yükləmək istəyiriksə — load()
çağırırıq. Çətin bir şey yoxdur.
9.3 Sətirə seriyalaşdırma
Çox vaxt obyektləri şəbəkə üzərindən ötürmək lazım olur, buna görə obyekt faylda deyil, sətirdə saxlanılmalıdır. Bunun üçün pickle
modulunda dumps
və loads
metodları var, və onların sonunda əlavə s
var.
Sətirə (yaxud byte massivi) seriyalaşdırma və deseriyalaşdırma üçün əsas addımlar:
-
pickle.dumps(obj)
istifadə edərək obyektin seriyalaşdırılması. -
pickle.loads(data)
istifadə edərək obyektin deseriyalaşdırılması.
Obyektin sətirə seriyalaşdırılması və deseriyalaşdırılması
Obyektin sətirə (yaxud byte dəstinə) seriyalaşdırılması daha da sadədir — sadəcə bir metod çağırmaq kifayətdir — dumps()
.
Nümunə:
import pickle
# Seriyalaşdırma üçün obyekt nümunəsi
data = {'name': 'Bob', 'age': 25, 'is_student': True}
# Obyektin sətirə seriyalaşdırılması
serialized_data = pickle.dumps(data)
print(serialized_data)
# Obyektin sətirdən deseriyalaşdırılması
loaded_data = pickle.loads(serialized_data)
print(loaded_data) # Çıxış: {'name': 'Bob', 'age': 25, 'is_student': True}
9.4 Sıralama zamanı yaranan səhvlər
Bəzən sıralama zamanı səhvlər baş verir. Bu halda pickle
modulu istisna atacaq:
-
pickle.PicklingError
— sıralama zamanı səhv. -
pickle.UnpicklingError
— desıralama zamanı səhv.
Nümunələr:
import pickle
data = {'açar': 'dəyər'}
try:
# Obyekti fayla sıralamaq
with open('data.pkl', 'wb') as file:
pickle.dump(data, file)
except pickle.PicklingError as e:
print(f"Sıralama səhvi: {e}")
try:
# Fayldan obyekti desıralamaq
with open('data.pkl', 'rb') as file:
loaded_data = pickle.load(file)
print(loaded_data)
except pickle.UnpicklingError as e:
print(f"Desıralama səhvi: {e}")
Adətən siz bir proqramçı kimi proqramın işləmə zamanı sıralama/desıralama səhvi ilə heç nə edə bilməzsiniz. Yeganə edə biləcəyiniz — səhvi log-a yazmaqdır ki, gələcəkdə onun nəyə görə baş verdiyini başa düşəsiniz.
Belə səhvlərin əsas səbəbi — obyektin formatının dəyişməsidir. Siz bir obyekti fayla yazırsınız, daha sonra proqramınızı yeniləyirsiniz və obyektə yeni sahələr əlavə olunur və ya köhnə sahələr silinir. Nəticədə, köhnə yazılmış obyekt, yeni obyektin sinfinə yüklənməyə çalışır...
Yenə də, bu vəziyyət tez-tez şəbəkə ilə iş zamanı baş verir — 2.18 versiya proqramı gözləniləndən bir qədər fərqli bir obyekt göndərir, 3.1 versiya proqramı isə onu qəbul etməyə hazır deyil. Bu, miqrasiya problemi adlanır və uzun müddətli və tələbatlı layihələrdə çox vaxt rast gəlinir.
GO TO FULL VERSION