İleri Python Geliştirme Kursu
Bölüm
>
Seviye
Serileştirme Modülleri
Marshal ve Pickle Modülleri
Amaç
Hizmet istasyonuna gidin ve dosyaları JSON modülünü kullanarak biçimlendirip verilerin düzgün şekilde saklandığından emin olun.
Yolu takip etmeye devam ettiğinizde, gelecekteki bir hasat için geliştirilen araziye ait su dağıtımını ve toprak kalitesini izleyen birkaç istasyon bulursunuz. Verileri işlemek için verileri serileştirmek etkilidir. Genelleştirilmiş bir çözüm olarak JSON kullanmak etkili olabilir, ancak Python’a özgü birkaç serileştirme yöntemi de vardır; bunlar Marshal ve Pickle modülleridir. Marshal modülü, verileri ikili formata dönüştürerek hızlı serileştirme/seri çözme işlemi yapmak için tasarlanmıştır ve daha basit veri aktarımları için idealdir. Pickle modülü ise daha yavaştır, ancak daha karmaşık veri yapılarıyla çalışmak üzere tasarlanmış olup çok daha esnektir; daha büyük veya öncelikli veri yapıları için idealdir.
Marshal ve Pickle modüllerini kullanmak için, fonksiyonlarını import marshal ve import pickle yazarak aktarın. Amacımız doğrultusunda aşağıdaki işlevleri kullanacağız:
marshal.dumps(): Verileri ikili formata (binary) dönüştüren, Python içinde hız için tasarlanmış bir serileştirme işlevidir. Tek bir argüman alır: serileştirmek istediğiniz veri; yalnızca temel veri tipleri desteklenir.marshal.loads(): İkili verileri Python'un okunabilir veri türlerine dönüştüren seri çözme işlevidir; yetenekleri sınırlı ama hızlıdır. Tek bir argüman alır: seri çözülmesi gereken veri.pickle.DEFAULT_PROTOCOL: Python sürümünüzdeki varsayılan Pickle serileştirme protokolü sürümünü kontrol eder. Protokoller verinin nasıl serileştirileceğini etkiler.pickle.HIGHEST_PROTOCOL: Python sürümünüzde kullanılabilen en yüksek Pickle serileştirme protokolü sürümünü kontrol eder. Protokoller verinin nasıl serileştirileceğini etkiler.pickle.dumps(): Verilen protokole göre karmaşık Python veri yapılarını ikili formata serileştirir. İki argüman alır: serileştirmek istediğiniz veri ve kullanmak istediğiniz protokol sürümü.pickle.loads(): İkili verileri Python'un okunabilir veri türlerine dönüştüren güçlü bir seri çözme işlevidir. Tek bir argüman alır: seri çözmek istediğiniz veri.
Buna ek olarak, from pprint import pformat yazarak içe aktaracağımız pformat adlı bir biçimlendirme modülü de kullanacağız. Bu sayede pformat() işlevi ile sözlükler gibi veri yapılarını formatlayarak bilgileri net bir şekilde görüntüleyebiliriz.
Başlamak için küçük izleme istasyonunun içindeki ışıklı X işaretine yürüyün ve bilgisayar terminaline dönün. İstasyon, ekim için geliştirilen yakın arazinin su basıncını ve toprak koşullarını izliyor. reading adlı bir sabit var; bu, istasyon tarafından toplanan Python verilerini içerir.
data adında bir değişken oluşturun ve reading sabitini argüman olarak kullanarak marshal.dumps() işlevinin değerini bu değişkene atayın. Şu şekilde: data = marshal.dumps(reading). Serileştirilmiş değişken verisini görüntülemek için önceden yazılmış display() işlevi ile data değişkenini kullanın.
İstasyondan çıkıp altın X işaretine doğru ilerleyin, kapıyı açmak ve ofise erişim sağlamak için open() işlevini kullanın. Terminalin önündeki ışıklı X işaretine yürüyün ve az önce serileştirdiğiniz veriyi seri çözün. output adında bir değişken oluşturun ve önceki data değişkenini argüman olarak kullanarak marshal.loads() işlevinin değerini bu değişkene atayın. İzleme istasyonundan topladığınız serileştirilmiş verilere erişmek için write() işlevinde output argümanını kullanın.
Ofisteki mavi halının üzerindeki ışıklı X işaretine yürüyün; terminalde, pickle modülünün veri işleme sırasında hangi serileştirme protokolünü kullanacağını belirlemek için protokolleri doğrulayacağız. Önceden yazılmış write() işlevindeki argümanları pickle.DEFAULT_PROTOCOL ve pickle.HIGHEST_PROTOCOL olarak ayarlayın. Bu, mevcut serileştirme protokolünü ve o an kullanılabilir en son serileştirme protokolünü doğrular.
Mavi halının üzerindeki karanlık X işaretine ilerleyin; protokolleri doğruladığımıza göre artık saklanan verileri kontrol edebiliriz. Aylar boyunca veri toplanıp samples adlı bir sabitte depolandı. Serileştirme için kullanılabilen üç protokolü doğrulamak üzere sereal_0, sereal_2 ve sereal_5 adlarında üç değişken oluşturun. Protokol 0 okunabilir ASCII biçimindedir ve verimli değildir; Protokol 2 daha verimli bir ikili formattır; Protokol 5 ise en yeni, en karmaşık özellikleri içerendir.
pickle.dumps() işlevinin değerini saklayacağız ve argüman olarak samples sabitini ile değişken adındaki sayıya karşılık gelen protocol değerini ayarlayacağız. Örneğin, sereal_0 için protocol=0 olacak şekilde şu ifadeyi kullanın: sereal_0 = pickle.dumps(samples, protocol=0). Her protokolün serileştirme biçimini karşılaştırmak için sereal_0, sereal_2 ve sereal_5 değişkenlerini önceden yazılmış display() işleviyle kullanın.
Kırmızı halının üzerindeki ışıklı X işaretine yürüyün ve terminale dönün, output değişkenini üzerine yazarak pickle.loads() işlevinin değerini saklayın ve argümanı olarak sereal_5 değişkenini ayarlayın; böylece şimdiye kadar toplanan örnek veriyi seri çözmüş olursunuz. Verileri görüntülemek için display() işlevini kullanın ve output değişkeni ile pformat() işlevini ekleyin. Örnek: await player.display(pformat(output)). Ardından, terminalde her ay için görüntülenen değerlendirmeleri not alın; bunları daha sonra çizelgelemek üzere kullanacaksınız.
Kırmızı halının üzerindeki karanlık X işaretine yürüyün ve masaya dönün; önceden yazılmış write() işlevine, terminalde görüntülenen her ay için not aldığınız değerlemeleri ekleyin. Bunları işlevde belirtildiği doğru sırada, çift tırnak "" içinde dizge (string) olarak ekleyerek görevi tamamlayın.