Python 3 İle Sunucular Arasında Liste, Sözlük vb. Aktarımı

Python 2.x sürümü ile çalışıyorsanız(mesela 2.7.3 ile denediğim kodlardan bahsediyorum) socket modülünün send() fonksiyonu ile karşı tarafa elinizdeki bir string’i rahatça gönderme şansınız var. Ancak Python3 ile çalışacaksanız bu aşamada bir şeylerin değişmesi gerekiyor. Yani string göndermek isterseniz size göndereceğiniz verinin bytes-like veya buffer olması gerektiğini söylüyor. Bu sorunu nasıl çözeceğimizi, ayrıca hem python2 hem python3 ile liste, sözlük, demet ve diğer veri tiplerini nasıl aktaracağımızı görelim.

Başlamadan önce, bu modülden beni haberdar ederek uzun araştırmalardan kurtaran, belki de Amerika’yı yeniden keşfetmemeyi sağlayan Fatih‘e bir teşekkür borcum var(aslında bir sürü var, bu sadece 1 tanesi).

Öncelikle kullanmamız gereken modülün adı json. Google App Engine’i incelerken de ismine rastlamıştım. Yani ileride lazım olması muhtemel bir modül. Kullanımı da oldukça basit. Temel olarak elimizde 2 fonksiyon olacak oynayabilmemiz için. Bunların isimlerini ve kısa açıklamalarını söyleyerek işe başlayalım:

json.dumps() – Bu fonksiyon elimizdeki veriyi json formatına çevirmemizi sağlıyor. String ya da liste vs. olması bir şey değiştirmiyor, normalde bir listeyi göndermek için bytes formatına çevirmemiz gerekirken sorun yaşamamız doğal. Ancak bu fonksiyon tam bu aşamada bizi büyük dertlerden kurtarıyor. Hemen bununla ilgili ufak bir örnek yapıp türüne bakalım:

liste = [i for i in range(1,100)] # List Comprehension yöntemiyle 1-99 arası sayıları içeren bir liste oluşturduk.
x = json.dumps(liste) # json.dumps fonksiyonu yardımıyla x değişkenine json formatını attık.
print(type(x)) # Elde ettiğimiz verinin formatını bastırdık. Sonuç string oldu.
print(x) # Tırnaklar içerisinde yer aldığını görebiliriz. Ya da kısaca tek satırda:
print(type(json.dumps([i for i in range(1,100)]))) # bu şekilde de yazmamız mümkün, ama çok anlaşılır durmuyor.

Şimdi de Türkçe karakterleri de içeren bir liste hazırlayıp onun üzerinde ufak bir deneme yapalım:

>>> type(json.dumps(liste))
<class 'str'>
>>> print(type(json.dumps([i for i in range(1,100)])))
<class 'str'>
>>> liste = ["Güray","Yıldırım"]
>>> type(liste)
<class 'list'>
>>> x = json.dumps(liste) # Listeyi json formatına çeviriyoruz
>>> type(x)
<class 'str'>

Bu kodlarla birlikte artık elimizde json formatında istediğimiz verilere sahibiz. Bunları string olarak kullanabildiğimiz için uzun uğraşlar sergilersek eski haline çevirmemiz mümkün. Tabii ki Python dünyasında buna gerek yok. Json modülünün bir başka fonksiyonu olan loads() fonksiyonunu hemen inceleyelim ve elimizdeki veriyi ilk haline tekrar çevirelim:

json.loads(jsonformatlıdeğişken) Bu fonksiyon ile elimizde olan yukarıda hazırladığımız json formatlı string verileri tekrar liste, demet ya da sözlük, veya string(Türkçe karakter sorunu yaşıyorsanız stringleri json a dönüştürmek bir çözüm olabilir) haline geri dönüştüreceğiz.

>>> liste = ["Güray","Yıldırım"]
>>> type(liste)
<class 'list'>
>>> x = json.dumps(liste) # Listeyi json formatına çeviriyoruz
>>> type(x)
<class 'str'>
>>> json.loads(x)
['Güray', 'Yıldırım']
>>> type(json.loads(x)) # Elimize aldığımız sonucun türüne bakalım
<class 'list'>
>>> sonhali = json.loads(x)
>>> print(sonhali)
['Güray', 'Yıldırım']

Son olarak da, bunları socket ile gönderirken bytes(x,”utf-8″) ile bytes-like object’e dönüştürürsek yaşama ihtimalimiz olan onlarca sorundan kurtulmuş ve kolayca karşı tarafa aktarmış oluruz. Tabii ki karşı tarafın aldığı bytes like object i str(bytesnesnesi,”utf-8″) fonksiyonuyla json formatına geri dönüştürmesi gerekiyor.

 
comments powered by Disqus