Gelişmiş Python Geliştirme Kursu
Bölüm
>
Seviye
Serileştirme modülleri
Marshal ve Pickle Modülleri
Hedef
Hizmet istasyonuna gidin ve dosyaları biçimlendirmek için JSON modülünü kullanarak verilerin düzgün bir şekilde depolandığından emin olun.
Yol boyunca devam ederken, gelecekteki hasat için geliştirilen arazi üzerindeki su dağıtımı ve toprak kalitesini izleyen birkaç istasyon buluyoruz. Verileri işlemek için verilerin seri hale getirilmesi oldukça etkilidir. Json kullanmak genel bir çözüm olarak etkili olabilse de, Python'a özgü birkaç seri hale getirme yöntemi de bulunmaktadır; bunlar Marshal ve Pickle modülleridir. Marshal modülü, verileri ikili formata dönüştürerek hızlı seri hale getirme/deserileştirme işlemleri için tasarlanmıştır, daha basit veri transferleri için idealdir. Pickle modülü daha yavaş çalışır ancak daha karmaşık veri yapılarının işlenmesi için tasarlanmış olup, daha büyük veya öncelikli veri yapıları için ideal, çok daha esnek bir yaklaşıma sahiptir.
Marshal ve Pickle modüllerini kullanmak için, import marshal ve import pickle yazarak fonksiyonlarını içe aktarın. Amacımız için aşağıdaki fonksiyonları kullanacağız:
marshal.dumps(): Python içerisinde hız için tasarlanmış, veriyi ikili biçime seri hale getirir. Seri hale getirmek istediğiniz veriyi argüman olarak alır, temel veri tipleriyle sınırlıdır.marshal.loads(): İkili veriyi, Python tarafından okunabilir veri türlerine deserileştirir; yetenekleri sınırlı olsa da hızlı çalışır. Deserileştirmek istediğiniz veriyi argüman olarak alır.pickle.DEFAULT_PROTOCOL: Python sürümünüzde Pickle seri hale getirme için varsayılan protokol sürümünü kontrol eder. Protokoller, verinin nasıl seri hale getirileceğini etkiler.pickle.HIGHEST_PROTOCOL: Python sürümünüzde Pickle seri hale getirme için kullanılabilir en yüksek protokol sürümünü kontrol eder. Protokoller, verinin nasıl seri hale getirileceğini etkiler.pickle.dumps(): Kullanılan protokole göre, karmaşık Python veri yapılarının ikili biçimde seri hale getirilmesini sağlar. Seri hale getirmek istediğiniz veriyi ve kullanmak istediğiniz protokol sürümünü argüman olarak alır.pickle.loads(): İkili veriyi, Python tarafından okunabilir veri türlerine deserileştirir; Python nesneleri için kapsamlı bir yapıya sahiptir. Deserileştirmek istediğiniz veriyi argüman olarak alır.
Bu modüllerin ve fonksiyonların yanı sıra, söz dizimi modülü biçimlendirme için pformat adında bir modül de kullanacağız. Bu, from pprint import pformat ile içe aktarılır. Bu sayede, sözlük gibi veri yapılarının biçimlendirilmesinde kullanılabilen pformat() fonksiyonu aracılığıyla bilgiyi net bir şekilde görüntüleyebiliriz.
Başlamak için, küçük izleme istasyonu içerisindeki ışıklı X işaretine doğru yürüyün ve bilgisayar terminaline yüzünüzü döndürün. İstasyon, ekim için geliştirilen yakın çevredeki arazinin su basıncını ve toprak koşullarını izlemektedir. reading adında bir sabit bulunmaktadır; bu, istasyon tarafından toplanan Python verilerini içerir.
data adında bir değişken oluşturun ve marshal.dumps() fonksiyonunun değerini, argüman olarak reading ile saklayın. Şöyle: data = marshal.dumps(reading). Seri hale getirilmiş değişken veriyi görüntülemek için önceden yazılmış display() fonksiyonu ile data değişkenini kullanın.
İstasyondan çıkarak altın X işaretine gidin, open() fonksiyonunu kullanarak kapıyı açın ve ofise erişim sağlayın. Terminalin önündeki ışıklı X işaretine gidin ve az önce seri hale getirdiğiniz veriyi deserileştirin. output adında bir değişken oluşturun ve marshal.loads() fonksiyonunun değerini, argüman olarak önceden elde ettiğimiz data değişkenini vererek saklayın. Toplama istasyonundan aldığınız seri hale getirilmiş veriye erişmek için write() fonksiyonunu kullanıp, argüman olarak output değişkenini ekleyin.
Ofiste mavi halı üzerindeki ışıklı X işaretine yürüyün; terminalde, Pickle modülünün veriyi işlerken hangi seri hale getirme yöntemini kullanacağını belirlemek için protokolleri doğrulayacağız. Önceden yazılmış write() fonksiyonu içerisinde, argümanları pickle.DEFAULT_PROTOCOL ve pickle.HIGHEST_PROTOCOL olarak ayarlayın. Bu, güncel seri hale getirme protokolünün yanı sıra mevcut en son seri hale getirme protokolünü doğrulayacaktır.
Ofiste mavi halı üzerindeki koyu X işaretine doğru ilerleyin; artık protokolleri doğruladığımıza göre, depolanmış veriyi kontrol edebiliriz. Aylar boyunca toplanan veriler samples adında bir sabitte depolanmıştır. Seri hale getirmenin mevcut üç protokolünü doğrulamak için, sereal_0, sereal_2 ve sereal_5 adında üç değişken oluşturacağız. Protokol 0 okunabilir ASCII olup çok verimli değildir, Protokol 2 daha verimli ikili format kullanır ve Protokol 5 ise en karmaşık özelliklerin eklendiği en son sürümdür.
pickle.dumps() fonksiyonunun değerini saklayacağız ve argüman olarak samples sabitini ve değişken adındaki numaraya karşılık gelen protocol değerini vereceğiz. Örneğin, sereal_0 için protocol değeri 0 olarak ayarlanır; şöyle: sereal_0 = pickle.dumps(samples, protocol=0). Farklı seri hale getirme yöntemlerini doğrulamak için, önceden yazılmış display() fonksiyonunda sereal_0, sereal_2 ve sereal_5 değişkenlerini kullanın.
Red halı üzerindeki ışıklı X işaretine gidin ve terminale yüz çevirin, output değişkenini yeniden tanımlayın ve pickle.loads() fonksiyonunun değerini, argüman olarak sereal_5 vererek saklayın; bu sayede şu ana kadar toplanmış örnek veriyi deserileştirmiş olacaksınız. Terminaldeki veriyi görüntülemek için, pformat() fonksiyonunu output değişkeni ile kullanarak display() fonksiyonunu çağırın. Şöyle: await player.display(pformat(output)). Terminalde görüntülenen her ayın puanlarına dikkat edin, böylece daha sonra bunları grafiğe dökebilirsiniz.
Red halı üzerindeki koyu X işaretine gidin ve masaya yönelin; önceden yazılmış write() fonksiyonunda, terminalde görüntülenen ve not aldığınız her ayın puanlarını ekleyin. Seviyeyi tamamlamak için, fonksiyonda belirtildiği sırayla, bu puanları "" içinde string olarak ekleyin.