CodeGym /Kurslar /Python SELF AZ /pickle ilə iş

pickle ilə iş

Python SELF AZ
Səviyyə , Dərs
Mövcuddur

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): Obyekti obj 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): Objekti obj 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ı:

  1. Faylı bayt yazma rejimində açmaq (wb).
  2. Obyekti seriyalaşdırmaq üçün istifadə edirik pickle.dump(obj, file).
  3. Obyekti deserializasiya etmək üçün istifadə edirik pickle.load(file).
  4. 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 dumpsloads 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.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION