27 Kasım 2010 Cumartesi

Python da encoding hataları

Mümkün olduğu kadar uygulamalarda encode ve decode olaylarından
uzak durun desemde en başa encode utf yazılıyor karışık bir durum..
Maksadınız kullanıcı tarafından girilen yada bir fonksiyon veya işlecden sonra
döndürülen bilgiyi kesinlikle ham halinde brakınız.Şayet sabit bir kullanıcı gurubu
var ise klavye girdi desenleri sabittir, bu duruma uygun kodlama kullanmanız
gerekir.

Bir sonuç girdisinin başka bir değişkene atanması demek varsayılan kodlama
süzgecinden geçmiş olur.
 Örnek:
 #-*- coding: utf8 -*-
kelime = "şişğçü"
hop_degis = kelime ##şimdi utf-8 kodlamasından geçmiş oldu

>>> fg=raw_input("yaz bakalım:")
yaz bakalım:şğğüçşğüşçğü
>>> fg
'\xfe\xf0\xf0\xfc\xe7\xfe\xf0\xfc\xfe\xe7\xf0\xfc'
>>> der=fg.encode('cp1254')
Traceback (most recent call last):
File "<pyshell#24>", line 1, in <module>
der=fg.encode('cp1254')
File "C:\Python26\lib\encodings\cp1254.py", line 12, in encode
return codecs.charmap_encode(input,errors,encoding_table)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xfe in position 0: ordinal not in range(128)
>>> print str(fg)
şğğüçşğüşçğü

Print fonksiyonunda bir sorun çıkarmaz fakat değişkenlere aktardığımız
zaman kodlama hatası verir.


>>> c=(str(fg)).decode('cp1254')
>>> print c
şğğüçşğüşçğü

Kodlama yerine dosya isimleri, hesap adları vs verilerinde yazılan betiği
kapsamlı bir try - excep yazılması hata risklerini azalttığı gibi kapsamlı bir hata
sınıflandırması yapmamızıda sağlar.

Liste işlemlerinden bir örnek

a=['5','9','8','6','3','4','2','85'] #tanımlanmış bir liste ve bu listenin
#alfabetik sıralanmış halindeki en son elemanı çağırmak istersek
#ne yapmamız gerekiyor?
#Evvela alfabetik sıraya koyup sonra son elemanını almaktansa

sonuc=(a[::-1])[0] # ibaresini kullanmak sanırım daha kolay olur
#buradaki a[::-1] kodlaması  reverse işlemini yapar.

FTP sunucusu çalıştırma

from pyftpdlib import ftpserver

authorizer = ftpserver.DummyAuthorizer()
authorizer.add_user('user', 'password', 'C:\\', perm='elradfmw')
authorizer.add_anonymous('C:\\')
ftp_handler = ftpserver.FTPHandler
ftp_handler.authorizer = authorizer.host
address = ("127.0.0.1", 21)
ftpd = ftpserver.FTPServer(address, ftp_handler)
ftpd.serve_forever()   ##Eyvallah forever tamam ama siz mutlaka triger için
##pipet ayarlamayı unutmayın.
##Bu ne işimize yarıyacak! tamam, menemen yapmaz ama en azından C: dizinindeki
## tüm dosyaları gösteriyor.Gizli dosyalar vesaire herhalde mesaj ulaşmıştır yerine..

Not defteri Uygulaması

import os ## Gerekli modülün çağrılması
b1="c:\\test.txt" ## ilgili uygulamaya eklenecek argüman burada path verilmiş.
os.system('notepad.exe ' + b1) ## + toplama işaretiyle bağlanması.

#Dikkat edilecek konu yanlızca kullanılan argümanın sürece
#uygun olup olmadığıdır. Argüman uyumsuz ise başka bir
#süreçten geçirilerek uygun hale getirilebilir.

8 Ekim 2010 Cuma

invalid path name - Geçersiz yer adı.

Bu hata genelde Tkinter arayüz kullanılan uygulamalarda alt öğe (sub) bileşeninden üst(main) öğe bileşenin içindeki bir yada bir kaç öğenin çağrılması yada nitelik atanmasından kaynaklanır. Görsel bileşenleriniz bir Class içinde değilse o bileşene ulaşıp yok edemez yada nitelik değiştiremezsiniz.Şayet Class yazmadan bu problemi bertaraf etmek isterseniz 'global' komutunu kullanabilirsiniz.Global komutu ilişkilendirilecek öğe (veya değişken) tanımından önce olmalıdır.

global deneme
deneme=Button(govde, bg='blue',fg='white', text='deneme')
deneme.pack()

#Burada 'govde' bu butonun tabi olacağı gövde adıdır.(bg=artalan rengi, fg=yazı rengi, text=buton metni, pack bir gösterim modudur ve nicelik gerektirmeden de kullanılabilir. Ayrıca bakınız place, grid vb)

Quick For-Hızlı for

Sadece öğeler için bir for döngüsü kullanmak isterseniz. Yeni listeniz tek komutla hazır! Bu örnekde 'listem1' öğesi
daha önceden oluşturulan bir dosya sürecidir.Python da değişkenler (tanımsız) özgürdür yani istediğiniz zaman istediğiniz biçime dönüştürebilirsiniz.Aynı adlı değişken bazen liste bazen tüp ve sözlük olduğu gibi bazende sayı veya yazı olabilir. Bir çok değişken adı tanımlayıp kafanız karışacağına en azından sadece uygulama boyunca bir sefer çalışacak koda farklı isimler koymak pek akıllıca sayılmaz.

listem1 = [liste.rstrip() for liste in listem1]

#Buradaki 'rstrip' kullanılan readlines komutunun bir zorunluluğudur kısaca anlatmak gerekirse listeye işlenecek satırlardaki 'enter' karakterlerini siler.

4 Ekim 2010 Pazartesi

IP numaranızı öğrenme

Aslında IP numaranızı heryerden öğrenebilirsiniz fakat burada  'urllib' in ne işe yaradığına örnektir.
Önemli Uyarı:Bazı web sayfaları kullanıcı kimliği (ki taleplerde 'header' olarak geçer ) olmayan talepleri yanıtsız brakır.Bu durum ziyaretçinin istenmeyen işletim sistemiyle sayfaya bağlanmasında da söz konusudur.Az bir karakter kod ilavesiyle bunlar aşılabilir(Ne güvenlik ama! Bence tutuculuk yada yobazlık olabilir...)
import urllib2

cann= urllib2.urlopen('http://canyouseeme.org/')  # IP adres bilgisi verip
                                                      #içeriği dinamik olmaya bir site...
kipim=cann.read()      #Sadece yazıları okur resimler veya medyalar  link olarak gözükür
nah=kipim.find('Your IP:') # IP bilgisinin referans(bulma)
                                         #noktasını bulma(Sayı olarak dönecektir(Integer))
hamip=kipim[nah:(nah+50)] #Referans notasından 50 karakter ilersine kadar
                                             #olan parça gerekli.(IP no uzunluğu 15 karakter)
del urllib2 #işe yaramayan kütüphaneyi silebileceğimize dair örnek (o:
ipim=hamip[((hamip.find('<td><b>'))+7):(hamip.find('</b></td>'))] #Html kodlarının
                      #hangi aralığındaysa o detayları giriyoruz.(tablo başladı,kalın yazma,'IP
                       #numaramız',kalın yazma bitti,tablo sonu)
                       #Neden +7 : print  len('<td><b>')
print ipim

Killprocces-uygulama sonlandırma

Bir kaç Tkinter ilavesiyle win32 işlemlerini sonlandırabilirsiniz.
*Ben win32'yi çoook seviyorum diyorsanız! Başlat>Çalıştır>taskkill /PID "PID NO"
  Bu PID listesine ulaşmak isterseniz Başlat>Çalıştır>tasklist
import win32api
import os

pid=3156 #Domuzluk yapan yanıt vermiyen windows uygulamasının işlem numarası
def yoket(pid):  #bu numarayı görev yöneticisinden Görünüm>Sütun seç>
                                     #PID(İşlem tanımlayıcı) aktif ederek görebilirsiniz
  yordam = win32api.OpenProcess(1, 0, pid) #İşlemin adreslenmesi
  return (0 != win32api.TerminateProcess(yordam, 0)) #Şayet o işlem aktifse kapatabilirsiniz
yoket(pid)                                               #Varolmayan bir şeyi yokedemezsiniz!
                                                 #Tkinter uygulamalarında sık görülen hata!

Gmailden direkt mail yollama

İnternet sitesine girmeden mail gönderme(smtp hesap gereklidir!)import smtplib

from_name = "Sado" #gönderen bölümündeki görünen isim
to = "Sado PY" #alıcı bölümündeki görünen isim
subject = "Well Come" #Konu bölümünde olacak metin

headers = "From: %s\r\nTo: %s\r\nSubject: %s\r\n\r\n" % (from_name, to, subject)
msg = headers + "Türk python gurubuna hoşgeldiniz.Saygılar"#Mesaj bölümü

mailserver = smtplib.SMTP("smtp.gmail.com", 587) #smtp server için host, port ayarı
mailserver.ehlo()
mailserver.starttls()#oturum açma
mailserver.ehlo()
mailserver.login("gönderenin hesabı@gmail.com", "gönderenin şifresi")
mailserver.sendmail("gönderenin hesabı@gmail.com", "alıcının adresi@alıcı.com", msg)
mailserver.close()

Mause kanca - rapor olayı

Mausu dinamik yada statik bilgi dizesinden faydalanarak belirli bir koordinata yollama:

import win32api

xy=['20, 758','1000,768']#gidilecek konum pixel ölçüler

for har in xy:
  harxy=har.split(',')#deseni parçalama
  x=harxy[0]
  y=harxy[1]
  e=win32api.SetCursorPos((int(x),int(y))) #konuma gönderme
  g=win32api.GetCursorPos() #konum bilgilerinin alınması

win32 hata kodlarından faydalanma

yazdığınız programda hata kodlarını bedavaya getirmek istiyorsanız sistem hata kodlarıyla sizin hata kodlarınız aynı ise bu metodla hata kodu (error strings) çıktısı alabilirsiniz:

# -*- coding: windows-1254 -*-
import pythoncom

hata_listesi=[]
for i in range(0,500): # aralık döngüsü başlangıç sıfır bitiş beşyüz artım adımı yazılmadığı için
  a=pythoncom.GetScodeString(int(i))                                          #varsayılan değer bir dir.
  z=a.decode('windows-1254') #türkçe harflerin düzeltilmesi
  b=str(i)+ ".Uyarı :"
  k=(b+a).decode('windows-1254')
  hata_listesi.append(k) #hata listesine eleman eklenmesi
  if i == 499 : #sonucu tekrar win32 hatalarından vermek isterseniz
    print pythoncom.GetScodeString(int(0)) #işlem başarıyla gerçekleşdi

#print hata_listesi #hata listesini tek satırda çıkartır

#listenin her bir elemanı tek satırda görmek için:
for i in hata_listesi:
   print i

basit bir zamanlayıcı

basit bir zamanlayıcı her nekadar 'timeit' modülü olsada öğrenmek maksadıyla hiç bir kodu hazır kullanmayın çünkü python bir betik dilidir.Şayet bu uygulamayı saniye değeri sıfır iken çalıştırırsanız sonsuz döngüye geçiş yapmış olacaksanız. Bunun sebebini siz bulacaksınız.Ayrıca '==' yerine '!=' kullandık bunun sebebi ise nelerden hoşlandığımızı söylemek yerine nelerden hoşlanmadığımızı söylemek daha kısa bir konuşma yapmamızı sağlar.
import time

zaman=time.time()
vakit=time.localtime(zaman)
d=vakit[5] #Vakit değişkeninden saniye bölümünün alınması
kontrol='devam' #Çevrim kontrolü için değişken oluşturma

while kontrol != 'dur': #Çevrimin hangi durumda aktif olacağını belirtme
    while ((time.localtime(time.time()))[5] ) == (int(d)-1): #zamanın kontrol edilmesi
       print "Bak ömründen 1 dakka gecti sen hala aynı noktadasın!"
       kontrol='dur'#Değişken içeriğini değiştirme