Category: python

Python’un güzellikleri -1

Posted by – 08 Ara 2007

Dönem projesi çalışmalarımın sürdüğü şu günlerde yine uzun zamandır yazı yazmadığımı fark ettim. 15 ay olmuş blog sahibi olalı bu uzun bir süre yazmaya alışmak için ama alışamadık vesselam :) Dönem projen de nedir diyenler olmuştur belki (?) açıklayayım sizi meraka teşvik edecek değilim . Hoşlandığım bir alan olduğunu fark etmem sonucu ve hazırlamayı düşündüğüm uygulama için temel olacak “Veri madenciliği” hakkında bir kaynak hazırlama. İkinci dönem uygulamaya dökeceğim kısmetse :) . Neyse konuyu bu kadar saptırmak yeterli sanırım :P .
Python Python Python…

Ya ben sana ne diyebilirim ki bir dil anca bu kadar güzel bu kadar mı kendini sevdirir sahibine. Bugün anlaşılan garip garip cümleler yazacağım, alışık değilsiniz ama arada olur sanırım bu tarz tuhaflıklar.

Sevgili arkadaşım Talat‘ın bana sunduğu html çözümleme kütüphanesinden size biraz bahsedeceğim. Pythonda htmlparsing modül sayısı baya bir fazladır. Bizim kullandındığımız htmldata kütüphanesidir.

Bu kütüphane ile en basitinden açılan linkin (urllib2 modulu ile açıp içeriğini okudğumuz ve gerektiğinde kodlamasını değiştirdiğimiz veri ) içeriği verildiğinde çeşitli şekillerde kaynak koduna erişebiliyorsunuz. Ben neden bu konuya geldim hemen açıklayayım xml sayfasını çözümlemem gerekiyordu pythonda xml parsing modülüde var elbetteki. Ancak benim inceleyeceğim şey 3-4 satırlık bir şeydi python-xml i olaya hiç karıştırmadan htmldata yardımıyla almam gereken verileri alabiliyorum.

htmldata ile ilgili olarak daha önce bir soru üzerinde hazırladığım kodu buraya koyuyorum. Verilen bir url yi çözümleyip “a href” tagındaki url değerlerini ekrana yazdıran basit bir program.

# -*- coding: utf-8 -*-

#**************************
# ornek calisma
#**************************

import htmldata
import urllib2

if __name__== “__main__”:

#kaynak kodu alinacak url
url= “http://www.connellybarnes.com/code/htmldata/”
req = urllib2.Request(url)
#url icerigi contents degerine aktariliyor
contents = urllib2.urlopen(req).read()
#htmldata modulu ile kaynak kod taglara parcalaniyor
# L= dizi, tag iceren L[indis] de bir dizi
#karakter kodlamasi sorunu olursa sayfa kodlamasini alip istedigin kodlama turune cevirebilirsin
# bu durumda tagextract() metotdunda kodlanmis halini parametre olarak gonderirsin
#u = unicode(contents, encoding=”iso-8859-9″) # sayfa karakter kodlamasi
#us= u.encode(”utf-8″) # yeni karakter kodlaman
L = htmldata.tagextract(contents)
for satirno in range(len(L)):
#L[satirno] dizisinin ilk elemani a ve bu string href takisi iceriyor mu
# orrnek L[satirno]= (’a', {’href’: ‘http://www.connellybarnes.com/’})
# ornekte goruldugu uzere tagin parametreleri sozluk olarak tanimlanmis
# href => L[satirno] dizisinin ikinci elemaninin alt indisidir
if L[satirno][0] == “a” and str(L[satirno]).find(”href”) != -1:
print L[satirno][1]["href"] # ile href degerini basiyoruz

Not: girintiler belli olmuyor c/p yaparken girintilere dikkat ederseniz sizin için iyi olur :P

htmldata için bıraktığım linkten htmldata.py yi indirip program dizininde yer alması gerekmektedir sadece. htmldata.py yi inceleyerek ve verilen linkteki metotları incelerseniz neler yapabileceğinize şahit olacaksınız . Python ve güzellikleri konulu ilk yazım bu olsun öncekileri değiştirmeyeyim şimdi:). Ondaki güzellikler bitmez ben keşfettikçe size yazacağım umarım bu kadar geç olmaz (htmldata yı yaklaşık 10 ay önce öğrendim).

Python ile soket programlama

Posted by – 22 Mar 2007


Başlangıç adına yazılması gereken çok şey olsa da, hazırlamış olduğum doküman uygulamaya dönük olduğundan burada yer alan kavramları bildiğinizi varsayıyorum. Yinede tanımlamak istediğim kavram şudur; internet aracılığıyla çalışan programlar soket kullanırlar ve soket programlarıdır. Bir makinede birden fazla soket vardır, akla gelen ilk örnekler http, ftp,ssh, telnet gibi…

serverhost = ‘x’ #sunucunun çalıştığı ip
serverport = y #sunucunun çalıştığı port
BUFSIZ=z #alınan veri için max. boyut
addr = (serverhost,serverport)
istemci ;
csock = socket(AF_INET, SOCK_STREAM,0)

# AF_INET (ARPA Internet protocols) soket ailesidir, internet uygulamalarında bu aile seçiliyor, SOCK_STREAM ise soketimizin türüdür burada TCP e göre seçilmiştir. Tür belirlemede SOCK_STREAM İLE SOCK_DGRAM arasındaki farkları bilmeniz önemlidir.

csock.connect(addr) #socket() ile tanımlanan soketin addr ye bağlanması
csock.send() # sunucuya veri gönderme
csock.recv(BUFSIZ) #sunucudan gelen veriyi alma
csock.close() # bağlantının kapatılması

sunucu ;

ssock = socket(AF_INET, SOCK_STREAM)
ssock.bind(addr) #Soketi adres ve isim bilgileri ile ilişkilendir
ssock.listen(2) #dinleyeceği max. bağlantı sayısı
ssock.accept() # kabul ettiği bağlantı bilgilerini verir(addr, ve bağlantı nesnesi)
ssock.send() #istemciye veri gönderme
ssock.recv(BUFSIZ) #sunucuya gönderilen veriyi alma

Kendi sunucu ve istemcimizi tasarlama zamanımız geldi;

sunucu.py;

from socket import *

serverhost = ‘127.0.0.1′
serverport = 2000
BUFSIZ=1024
addr = (serverhost,serverport)
ssock = socket(AF_INET, SOCK_STREAM,0)
ssock.bind(addr)
ssock.listen(2)
while (1):
clientsock, addr = ssock.accept()
print “connected:”,addr
while True:
data = clientsock.recv(BUFSIZ)
if not data:
break
else:
data=”client: “+data
print data
data = raw_input(’server: ‘)
clientsock.send(data)
ssock.close()

sunucu.py yi incelediğimizde oluşturulan sunucu soketimiz dinlemede aşamasındadır. ilk while döngüsü sunucuya bağlanan istemciyi sunucu kabul ettiğinde geçerlidir , sunucu kabul ettiği bağlantı ile boş veri alana kadar veri alıp veri gönderir. Boş veri alırsa, yani veri yollanmaz ise bağlantı düşer.

istemci.py ;

from socket import *

serverhost = ‘127.0.0.1′
serverport = 2000
BUFSIZ=1024

addr = (serverhost,serverport)
csock = socket(AF_INET, SOCK_STREAM,0)
csock.connect(addr)
while (1):
data = raw_input(’client: ‘)
if not data:
break
else:
csock.send(data)
data = csock.recv(BUFSIZ)
data=”server: “+data
print data

csock.close()

istemci.py de sunucumuza bağlanıp veri göndermektedir while döngüsü içinde, gönderdiği veri olmadığı durumda bağlantı sona ermektedir.

Bu konuya değinmemin sebebi yapmış olduğum oyun+chat programından önce bir alıştırmadır. OpenGL grafik arayüzü ile hazırlamş olduğum çalışmayı en kısa zamanda ekleyeceğim.

NOT: python syntaxına dikkat edelim, boşluklar görünmüyor

Python ile MySQL server üzerinde işlem yapmak

Posted by – 20 Mar 2007

Okul projelerinden zaman bulduğumda yazı yazmaya gayret gösteriyorum ancak bu pek kolay olmuyor. Neyseki bu seferki de anlattıldı. Konumuz başlığından da anlaşılacağı üzere python ile mysql serverda işlemler yapmak. Python ile bu işlemleri yapmak için ben pythonun MySQLdb modülünü kullanmaktayım. MySQLdb python için populer MySQL database servera bir arayüzdür.

Metin işlemcisi ile açmış olduğumuz deneme.py dosyamızın başına MySQLdb modülünü ekliyoruz

import MySQLdb

import sys

try:

conn = MySQLdb.connect (host = “localhost”,user = “anil”,passwd = “12345″,db = “deneme”)

# bağlantı oluştururken try except blokları kullanılır

except MySQLdb.Error, e: # mySql servera bağlanılmadığı durumdaki işlemler

print “Error %d: %s” % (e.args[0], e.args[1]) # hata yazılıyor

sys.exit (1) # uygulama sonlandırılıyor

cursor = conn.cursor () # bağlantı üzerinde imleç nesnesi oluşturma
cursor.execute (”SELECT * FROM tablo1″) # imlec üzerinde çalışacak sql stringimiz
rows = cursor.fetchall () # kayıtlarımızı kayıt dizisine atmaktayız

#bu kısmı biraz açıklamak gerekirse diyelim ki 5 sütundan oluşan bir tablomuz var ve toplam 20 satır kayıt bulunmakta. rows dediğimiz şey tüm satırları içeren bir dizidir ilk satırdaki verilere erşimek için rows[0] deriz. İlk satırdaki ilk sütuna ulaşmak istediğimizde de rows[0][0] demeliyiz.
# biz bu işi kolaylaştırıp for döngüsü ile verilerimizi alıyoruz

for row in rows:
for i in range(sutunno): # tablomuzdaki sütun sayısı
print row[i]

cursor.close() # işlemimizi kapatıyoruz

fetchall() dışında;

fetch_row() metodu ile tek satırlık kayıtlar alınmaktadır. Sql stringiniz sonucunda dönecek değer tek kayıttan ya da tek sutundan oluştuğu sırada kullanılması iyi olur.

fetchone() imleç üzerinde yapılan son işlem sonucu dönen kayıtlardan ilkini verir.Daha sonra bir sonraki kayıtta konumlanır.

rowcount() imleç üzerinde çalıştırılan son sorgu sonucu dönecek satır sayısını vermektedir

Python ile MySQL server üzerinde işlem yapmaya bir giriş olarak bu konuyu değerlendirebilirsiniz.

Not: Python syntax yapısına dikkat edin, boşluklar görünmüyor bende :)