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.