Python etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
Python etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

Python DateTime Modülü

Python'da datetime modülü, tarih ve zamanla ilgili işlemler yapmanızı sağlayan bir standart kütüphanedir. Aşağıda, datetime modülünü kullanarak temel işlemleri nasıl gerçekleştireceğinizi gösteren birkaç örnek bulunmaktadır:

Tarih ve Zamanı Almak:

from datetime import datetime
# Şu anki tarih ve zamanı almak
now = datetime.now()
print(now)

# Belirli bir tarihi ve zamanı oluşturmak

specific_date = datetime(2023, 9, 21, 12, 30, 0)  # Yıl, Ay, Gün, Saat, Dakika, Saniye
print(specific_date)

Tarihi Biçimlendirmek:

from datetime import datetime
now = datetime.now()
formatted_date = now.strftime("%Y-%m-%d %H:%M:%S")
print(formatted_date)

Tarih ve Zamanı Ayırmak:

from datetime import datetime
now = datetime.now()
year = now.year
month = now.month
day = now.day
hour = now.hour
minute = now.minute
second = now.second
print(f"Yıl: {year}, Ay: {month}, Gün: {day}, Saat: {hour}, Dakika: {minute}, Saniye: {second}")

Tarih ve Zaman İşlemleri:

from datetime import datetime, timedelta
now = datetime.now()
yesterday = now - timedelta(days=1)
tomorrow = now + timedelta(days=1)
print(f"Bugün: {now}")
print(f"Dün: {yesterday}")
print(f"Yarın: {tomorrow}")

Tarih içinde bazı alanları sıfır olarak almak:

import datetime
dt = datetime.datetime.now()
dt = dt.replace(hour=0, minute=0, second=0, microsecond=0)

X gün önceki veya sonraki tarihi bulmak.

50 gün önceki tarihi bulan kod.

import datetime 
today = datetime.datetime.now()
d = datetime.timedelta(days = 50)
a = today - d
b = today + d
print(a, b)

Bu örnekler, datetime modülünün temel kullanımlarını göstermektedir. 



Python Yazılımı İçin Log Oluşturma

 Python kodunuzun loglarını takip etmek istiyorsanız program çalışırken oluşan hataları veya mesajları bir log dosyasına yardırabilirsiniz. Bu log dosyası yazılımınızın geçmişe dönük çalışmasıyla ilgili size bilgi verecektir. Python'da en popüler log oluşturma kütüphanesi logger kütüphanesidir. Logger yazılımını bilgisayarımıza yükleyerek başlayalım.

pip install logger

Modülü yükledikten sonra yazılıma import edelim.

import logging

İlk olarak oluşturduğumuz log için bir isim tanımı yapalım.

logger = logging.getLogger("Log_adı")

Mesaj seviyesi belirleyelim, bu seviye ve üzerindeki loglar alınır. Örneğin: Error seçilirse sadece error ve critical logları alınır.

Seviyeler:

  1. debug
  2. info
  3. warning
  4. error
  5. critical

logger.setLevel(logging.DEBUG)

Logların yazılacağı dosyanın belirlenmesi;

logging.basicConfig(filename='dosya_adi.log', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', filemode="w", level=logging.DEBUG)

Burada filemode="w" ise her çalıştırmada eski dosya silinerek yeni dosya oluşturulur. filemode="a" ise bilgiler eski dosyaya eklenerek kaydedilir. Ekrana yazdırma parametreleri;

ch = logging.StreamHandler()

ch.setLevel(logging.DEBUG)

Log formatı;

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(pathname)s:%(lineno)d')

asctime = Çalışma zamanı

name = Log adı

levelname = Log level

message = Yazdığınız veya sistemden okuduğu hata mesajı.

pathname = Dosyanın bulunduğu dizin.

lineno = Kodun çalıştırdığı satır.

Ekrana yazılacak veriye format uygulanması

ch.setFormatter(formatter)

logger.addHandler(ch)

Yazılır.

#Uygulama mesaj formatları;

Print komutunu kullanır gibi aşağıdaki formatta yazdığınız tüm mesajlar log dosyasında oluşacaktır.

logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

Kodun tamamı

import logging
logger = logging.getLogger('Log_adı')
logger.setLevel(logging.DEBUG)
logging.basicConfig(filename='dosya_adi.log', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(pathname)s:%(lineno)d', filemode="w", level=logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(pathname)s:%(lineno)d')
ch.setFormatter(formatter)
logger.addHandler(ch)

Tavsiye edilen kullanım:

import logging
import os
logger_name=os.path.basename(__file__)
logger = logging.getLogger(logger_name)
logger.setLevel(logging.DEBUG)
logging.basicConfig(filename=logger_name+'.log', format='%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(pathname)s:%(lineno)d', filemode="w", level=logging.DEBUG)
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s - %(pathname)s:%(lineno)d')
ch.setFormatter(formatter)
logger.addHandler(ch)

Python Log'larını otomatik olarak mail atmak için

Koda aşağıdaki satırları da ekleyerek mail atma işlemini de gerçekleştirebilirsiniz.

import logging.handlers

Mail_sender = "email_user@domain.com"
Sender_pwd = "passWord" #Password kullanımı opsiyoneldir...
smtpHandler = logging.handlers.SMTPHandler(
    mailhost=("localhost", 25),
    fromaddr="noreply@domain.com",
    toaddrs="user@email.com",
    subject="Dikkat!",
    credentials=(Mail_sender, Sender_pwd))
smtpHandler.setLevel(logging.DEBUG)
smtpHandler.setFormatter(formatter)
logger.addHandler(smtpHandler)

Not: Mail atarken alarm seviyesini warning olarak ayarlayın, yoksa çok fazla mail ile karşı karşıya kalabilirsiniz.


Python Yazılımı İçin Konfigürasyon Dosyası

 Python yazılımı için bir konfigürasyon dosyası nasıl oluşturulur?

Yazılım kodunda sürekli değişiklik yapmamak için veya kod üzerinde başkaları ile çalışırken kullanıcı adı ve şifre bilgilerinin açık bir şekilde görünmemesi için bir konfigürasyon dosyası hazırlayıp değişkenleri burada tanımlamak çok kullanışlı olacaktır. Bu değişkenler username, password, host, port, ve IP gibi sürekli değişecek bilgiler olabilir. İlk olarak config.py isimli bir dosya oluşturalım ve içeriğini gerekli bilgiler ile aşağıdaki örnekteki gibi dolduralım.

#### Konfigürasyon Dosyası ###
host = 'localhost'
port = '8080'
username = 'user'
password = 'password'

Dosyaya bilgileri yazdıktan sonra config.py ismi ile yazılımımızın dosyalarının olduğu klasöre kaydedelim. Konfigürasyonun import edilebilmesi için main.py dosyası ile config.py dosyası aynı klasörde olmalıdır. Yazdığımız kod içinden bu değişkenleri çağırmak için aşağıdaki örnek koda uygun bir şekilde değişkenleri çağıralım. Bu dosya adı main.py olsun.

import config
host = config.host
port = config.port
username = config.username
password = config.password

Main.py isimli kodu çalıştırdığınızda config.py isimli dosyadaki değişkenler yüklenecektir. Kod çalıştığında konsol'da aşağıdaki gibi bir mesaj görünür.

Reloaded modules: config 

Böylece konfigürasyonları yazdığımız dosya config.py ana dosyayı main.py çalıştırdığımızda yüklenecektir ve içerdiği bilgileri kullanabileceğiz. Özellikle password içeren kodlarda başkaları ile beraber çalışıyorsanız veya eğitim veriyorsanız bilgileri bu şekilde kod içinde görünmez hale getirebilirsiniz. Yazdığınız kodu başkaları da çalıştırabiliyorsa veya dosyalara erişebiliyorsa bu yöntem size güvenlik sağlamaz.

Konfigürasyon bilgilerini güvenli bir şekilde saklamak.

Güvenli bir şekilde konfigürasyon bilgilerini saklamak istiyorsanız cryptography modülünden faydalanabilirsiniz. İlk olarak bir konfigürasyon dosyası hazırlayıp bu dosyayı şifrelemek ve şifreli dosyayı kullanmak en güvenli yollardan biri olacaktır. İlk olarak yukarıda anlatıldığı gibi bir konfigürasyon dosyası oluşturun ve adını config.py olarak kaydedin. Pythn cryptography modülünü kurun;

pip install cryptography

Hazırladığınız config.py dosyasını şifrelemek için bir key oluşturun ve bu key bilgisini sonra kullanmak üzere bir dosyaya yazdırın. Daha sonra konfigürasyon dosyanızın şifreli bir halini oluşturun. Aşağıdaki kod key dosyası ve şifrelenmiş bir konfigürasyon dosyası oluşturmamızı sağlar.

from cryptography.fernet import Fernet

key = Fernet.generate_key()
print(key)

#Oluşturduğunuz key bilgisini dosyaya kaydeder.
with open('mykey.key', 'wb') as mykey:
    mykey.write(key)
    
f = Fernet(key)

with open('config.py', 'rb') as original_file:
    original = original_file.read()
encrypted = f.encrypt(original)

with open ('encrypted.py', 'wb') as encrypted_file:
    encrypted_file.write(encrypted)

Bu kod iki adet çıktı elde eder. mykey.key oluşturulan key bilgisinin içinde bulunduğu dosya, encrypted.py config.py dosyasının şifrelenmiş versiyonudur. 

İşlemden sonra mykey.key dosyasını mutlaka saklamalısınız, bu dosya şifreli encrypted.py dosyasını düzgün bir şekilde açmanızı sağlayacaktır. Artık bilgilerin açık bir şekilde yazılı olduğu config.py dosyasını başka bir güvenli yere taşıyabilir veya silebilirsiniz. Oluşturduğunuz şifreli konfigürasyon dosyasındaki bilgileri kullanmak için aşağıdaki kod size yardımcı olacaktır. 

from cryptography.fernet import Fernet

with open('mykey.key', 'rb') as filekey:
    key = filekey.read()
print(key)
f = Fernet(key)

with open('encrypted.py', 'rb') as encrypted_file:
    encrypted = encrypted_file.read()

decrypted = f.decrypt(encrypted)
data=decrypted.decode('UTF-8')

for line in data.splitlines():
    print(line)
    if "host" in line:
        host=re.split("'", line)[1]
    elif "port" in line:
        port=re.split("'", line)[1]
    elif "username" in line:
        username=re.split("'", line)[1]
    elif "password" in line:
        password=re.split("'", line)[1]

print(host, port, username, password )

config.py dosyasını tekrar oluşturmak isterseniz yukarıdaki koda aşağıdaki kod parçacığını eklemeniz yeterlidir.

with open('config.py', 'wb') as dec_file:
    dec_file.write(decrypted)




SSH Bağlantısı Üzerinden Telnet Bağlantısı

 Bir sunucuya veya cihaza SSH bağlantısı kurup bu bağlantı üzerinden Telnet ile başka bir cihaza bağlanabilmek için Python kodu içinde SSH için Paramiko, Telnet için Telnetlib modülleri kullanılabilir. Aşağıdaki kod bir sunucuya SSH ile bağlanmanızı ve aynı sunucu üzerinden Telnet ile başka bir cihaza komut göndermenizi sağlar.

import paramiko
import telnetlib

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect('ssh_hostname', username='ssh_username', password='ssh_password')
tn = ssh.invoke_shell()
tn.send('telnet telnet_hostname\n')
tn.expect(['Username: '])
tn.send(f'{telnet_username}\n')
tn.expect(['Password: '])
tn.send(f'{telnet_password}\n')

# Telnet bağlantısı kurulunca burada telnet üzerinde yapmak istediğiniz komutları gönderebilirsiniz
tn.send('ls\n')
output = tn.recv(9999).decode('ascii')
print(output)
tn.close()
ssh.close()

Bu kodda bulunan, ssh_hostname, ssh_username, ssh_password, telnet_hostname, telnet_username, telnet_password değişkenlerine bağlanmak istediğiniz SSH ve Telnet sunucularının adresleri, kullanıcı adları ve parolalarıdır.


Python IP Doğrulama (IPv4 IPv6 Public Private)

 Python içinde hazır gelen Ipaddress modülü bir IP adresini doğrulamak ve tanımlamak için bize yardımcı olacaktır. IP adresi IPv4, IPv6, Public veya private olabilir. Bu ayrımı küçük bir fonksiyon ile anlayabiliriz.

def validate_ip_address(ip_string):
    try:
        ip_object = ipaddress.ip_address(ip_string)
        if ipaddress.ip_address(ip_string).is_private == False:
            if ip_object.version == 4:
                print("IPv4")
                return "IPv4"
            else:
                print("IPv6")
                return "IPv6"
        else:
            print("The IP address is private")
            return "private"
    except ValueError:
        print("The IP address is not valid")
    return "NotValid"

validate_ip_address(192.168.0.1)

Bir IP adresinin Network IP'sini bulmak istiyorsak aşağıdaki kod bize yardımcı olacaktır.

ip_address=192.168.1.55/24
net_ip=ipaddress.ip_network(ip_address, strict=False)
print(net_ip)

Ayrıntılı bilgi için aşağıdaki adrese göz atabilirsiniz.

ipaddress — IPv4/IPv6 manipulation library

https://docs.python.org/3/library/ipaddress.html

Kaynak kod: https://github.com/python/cpython/blob/3.10/Lib/ipaddress.py

IP versiyon 4 - IP versiyon 6 - Public IP - Private IP 

IP Versiyon kontrolü.

IP bilgileri nasıl listelenir:

-------------------------------------------------
import ipaddress
 
# Initializing an IPv4 Network.
network = ipaddress.IPv4Network("192.168.1.0/24")

print(network)
 
# Network address of the network: 192.168.1.0
print("Network address of the network:", network.network_address)
 
# Broadcast address: 192.168.1.255
print("Broadcast address:", network.broadcast_address)
 
# Network mask: 255.255.255.0
print("Network mask:", network.netmask)
 
# with netmask: 192.168.1.0/255.255.255.0
print("with netmask:", network.with_netmask)
 
# with_hostmask: 192.168.1.0/0.0.0.255
print("with_hostmask:", network.with_hostmask)
 
# Length of network prefix in bits: 24
print("Length of network prefix in bits:", network.prefixlen)
 
# Total number of hosts under the network: 256
print("Total number of hosts under the network:", network.num_addresses)
 
# Overlaps 192.168.0.0/16: True
print("Overlaps 192.168.0.0/16:", network.overlaps(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Supernet: 192.168.0.0/23
print("Supernet:", network.supernet(prefixlen_diff=1))
 
# The network is subnet of 192.168.0.0/16: True
print("The network is subnet of 192.168.0.0/16:",
      network.subnet_of(ipaddress.IPv4Network("192.168.0.0/16")))
 
# The network is supernet of 192.168.0.0/16: False
print("The network is supernet of 192.168.0.0/16:",
      network.supernet_of(ipaddress.IPv4Network("192.168.0.0/16")))
 
# Compare the network with 192.168.0.0/16: 1
print("Compare the network with 192.168.0.0/16:",
      network.compare_networks(ipaddress.IPv4Network("192.168.0.0/16")))


Python

Python Belli Bir Zaman Aralığında Çalıştırma

Python yazılımını belli saatler aralığında çalıştırmanız gerekirse aşağıdaki kodu bu amaçla kullanabilirsiniz. Kod aynı zamanda bir animasyon da içermektedir. Bist açılış kapanış saatleri arasında bir kod çalıştıracağınızı düşünelim. Kod işlem başladığında mevcut zaman aralık dışında ise ekrana animasyon çıktısı verir. Mevcut zaman aralık içerisinde ise yazılım bir sonraki adıma devam eder.

import time
import datetime
def time_in_range(start, end):
    current = datetime.datetime.now().time()
    return start <= current <= end

def typewriter(text, delay=0.1):
  for letter in text:
    print(letter, end='', flush=True)
    time.sleep(delay)
  print()

def starttime():
    start = datetime.time(9, 35, 0)
    end = datetime.time(18, 15, 0)

    result=time_in_range(start, end)
    while result==False:
        typewriter("#########################", 0.05)
        typewriter("########-BIST-########", 0.05)
        typewriter("####-"+str(datetime.datetime.now().time())+"-####", 0.05)
        result=time_in_range(start, end)
    
starttime()





Python Pandas Kullanımı

 Pandas en çok kullanılan modül olarak karşımıza çıkıyor. Bu bölümde Pandas'ın bazı önemli özelliklerinden bahsedeceğiz, pandas komutları ve kullanımını inceleyeceğiz. Pandas en kullanışlı data frame yöntemlerinden birisidir. Python code içerisinde bir database oluşturmak için kullanılır ve ram'de saklanır. Bir database'e veri yazıp sonra okumaktansa ram üzerinden bir dataframe oluşturup işlemleri bu df ile yapmak işleri çok hızlandıracaktır. Peki pandas nasıl kullanılır bakalım. İlk olarak pandas yükleyip import etmemiz gerekir. Yüklemek için;

# conda
conda install pandas
pip install pandas
# pip

Python kodumuza import etmek için;

import pandas as pd

kodu kullanılmalıdır. import komutu sonundaki as pd yeniden isimlendirmek için kullanılmaktadır ve pandas python içinde genelde pd kısaltmasıyla kullanılır, dataframe kısaltması da df şeklinde kullanılmaktadır. Basit boş bir dataframe oluşturmak için;

Data frame:

df=pd.DataFrame()

kodunu kullanabiliriz. Kodu oluşturmadan önce kolon isimlerini ve kaç adet kolon kullanacağımızı biliyorsak bu bilgilerle boş frameimizi oluşturabiliriz.

df=pd.DataFrame(columns =['kolon1','kolon2'])

Pandar df'ye genelde dictionary ile oluşturulur. Df'ye elimizdeki bir data ile oluşturmak için;

data={'kolon1': [21, 23, 24, 21], 'kolon2': [1,2,3,4]}

df = pd.DataFrame(data)

veya

data = []
data.append([21, 1, 'India'])
data.append([23, 2, 'India'])
data.append([24, 3, 'India'])
data.append([24, 4, 'India'])
df = pd.DataFrame(data, columns=['kolon1', 'kolon2', 'kolon3'])

Bir dataframe'e sabit değerli bir kolon eklemek için aşağıdaki komutu kullanabilirsiniz. Bu komut frame sonuna bir kolon ekler ve kolondaki tüm değerleri 10 yapar.

df["Percentage"] = 10

Ekleyeceğimiz kolonu sona değilde en başa veya belirli bir yere eklemek için aşağıdaki komutu kullanabilirsiniz. En başa eklemek için 0, sonraki kolon sıraları için bir artırarak kolonun yerini belirtebilirsiniz. Biz 2. sıraya (Yani 1. sıraya) bir kolon ekleyelim.

df.insert(1, 'Percentage', '10')

Data frame'i bir data ile oluşturduk buna data içeren bir kolon daha eklemek istersek;

kolon3 = ['Delhi', 'Bangalore', 'Chennai', 'Patna']

df['kolon3'] = kolon3

veya

df2 = df.assign(kolon3=['Delhi', 'Bangalore', 'Chennai', 'Patna'])

veya

Eklenecek olan kolon 2. sıraya yerleştirilecek ise;

df.insert(1, "kolon3", ['Delhi', 'Bangalore', 'Chennai', 'Patna'], True)

şeklinde kolonlar arasına yeni bir kolon yerleştirilebilir.

Pandas Frame'e Veri Ekleme:

df + 1 veya df.add(1) dataframe içindeki tüm numeric değerleri bir artırır.

df.div(10) tüm değerleri 10'a böler.

df - [1, 2] veya df.sub([1, 2], axis='columns') 1. kolondan 1, 2. kolonda 2 değerini çıkarır.

Bir pandas frame ile dictionary dataframe'i birleştirmek için append kullanılır.

df2 = {'kolon1': '15', 'kolon2': '23', 'kolon3': 'India'}

df = df.append(df2, ignore_index = True)

Bir Pandas frame ile başka bir pandas frame'i birleştirmek için concat kullanabilirsiniz.

df2 = pd.DataFrame({'kolon1': [11], 'kolon2' : [23],  'kolon3' : ['India']})

df = pd.concat([df, df2], ignore_index = True, axis = 0)

Pandas Veri Görüntüleme:

Pandas'da büyük tabloları ekranda görüntülemeye çalıştığınızda pandas size özet bir ekran çıkarır, tüm satır ve sütünları görmek istiyorsanız bazı ekler kullanmalısınız.

Tüm satırları görmek isterseniz;

pd.set_option('display.max_rows', None)
df = pd.read_csv("data.csv")
print(df)

kodunu kullanmalısınız. None yazan yere görmek istediğiniz satır sayısını yazabilirsiniz. Tüm sütünları görmek isterseniz;

pd.set_option('display.max_columns', None)
df = pd.read_csv("data.csv")
print(df)

None yazan yere görmek istediğiniz sütün sayısını yazabilirsiniz. 

Dataframe hakkında genel bilgi

df.info()

Sütünların bilgileri

df.describe()

İlk 5 satırı görmek için

df.head()

Son 7 satırı göster

df.tail(7)

Datafame içinde belirli bir satır ve sütünu görmek için;

df.loc[row, column]

index

Pandas listelerinizin yanında bir index gösterir, dosyaya yazarken bu indexin görünmesini istemiyorsanız;

    data = pd.read_sql(query, con=connection)
    data.to_csv('data.csv', index=False)

Bu şekilde index'i kapatabilirsiniz.

Pandas Framelerini Birleştirme:

Elimizde üç ader dataframe olduğunu düşünelim. Bu dataframelerin kolonları aynı ise bunları tek bir dataframe'de birleştirmek için:

frames = [df1, df2, df3]

result = pd.concat(frames)

Elimizde olan bir data frame'e bir başka dataframe'den ekleme yapacak isek append komutunu kullanabiliriz.

DataFrame.append(dataframe, ignore_index=False, verify_integrity=False, sort=None) 
ör;
result=pd.DataFrame()
result=result.append(df, ignore_index=True, verify_integrity=False, sort=None)

Duplicate verileri silme
    Single_List=Single_IP_List.drop_duplicates()
Bu komutta index'i de yeniden oluşturmak için parantez içine ignore_index=True yazılabilir veya aşağıdaki işlem yapılır.
    Single_List = Single_IP_List.reset_index(drop=True) #Duplicate veriler silindiği için index yeniden oluşturulur.
    print(Single_List)

Python Pandas kullanımı ve pandas komutları.

Diğer Konular;

Pandas DataFrame

Pandas tutorial

Pandas read_csv

Pandas groupby

Pandas merge

Pandas documentation

Pandas functions

Pandas plot

Pandas data manipulation

Pandas data analysis

Python Konsol Animasyonları

 Python yazılımını konsol ekranında çalıştırıyorsanız açılışta veya bir çıktı beklerken kullanıcıya bir animasyon izletebilirsiniz. Bu bölümde birkaç animasyon paylaşıyorum.

Loading animasyonu

#!/usr/bin/env python
from time import sleep
def progress(percent=0, width=30):
    hashes = width * percent // 100
    blanks = width - hashes
    print('\r[', hashes*'#', blanks*' ', ']', f' {percent:.0f}%', sep='',
        end='', flush=True)
print('Yükleniyor...')
for i in range(101):
    progress(i)
    sleep(0.1)
print()

Dikey Sinüs

import os 
import sys
def console_frame(output):
os.system('clear' if os.name == 'posix' else 'CLS')
sys.stdout.write(output + "\n")
sys.stdout.flush()
import time
import math
for t in range(100):
console_frame("\n".join(["*" * (30 + int(30 * math.sin(.1 * x + .1 * t))) for x in range(30)])) # time-varying sine wave
time.sleep(.04)

Loading Çizgi Animasyon

import itertools
import threading
import time
import sys
done = False
#here is the animation
def animate():
    for c in itertools.cycle(['|', '/', '-', '\\']):
        if done:
            break
        sys.stdout.write('\rloading ' + c)
        sys.stdout.flush()
        time.sleep(0.1)
    sys.stdout.write('\rDone!')
t = threading.Thread(target=animate)
t.start()
#long process here
time.sleep(10)
done = True

Kalın çizgi

import time
def typewriter(text, delay=0.1):
  for letter in text:
    print(letter, end='', flush=True)
    time.sleep(delay)
  print()
typewriter("############")
typewriter("############", 0.05)



Python Windows Mesaj Kutusu

Python kodu içerinsinde windows için bir hata mesajı oluşturmak istiyorsanız çok küçük bir kod ile bunu yapmanız mümkün. Yazılım çalışırken istediğiniz alana geldiğinde aşağıdaki kalın harflerle gösterilen kodları mesajın verileceği yere yerleştirmeniz yeterli olacaktır. İlk iki satırı kodun en başına koyabilirsiniz. Bu kod büyük kütüphane bağımlılığı olmadan windows mesajı göstermenizi sağlar.

import ctypes
MessageBox = ctypes.windll.user32.MessageBoxW
MessageBox(None, 'Dikkat!!! Mesaj 1...', 'Mesaj Başlığı 2', 0)
MessageBox(None, 'Dikkat!!! Mesaj 2...', 'Mesaj Başlığı 2', 0)

Bu kod Python versiyon 3.x. içindir Python versiyon 2.x, için MessageBoxW yerine MessageBoxA kullanmalısınız.

Daha gelişmiş mesaj ekranları kullanmak istiyorsanız Tkinter kütüphanesi sizin için çok kullanışlı olabilir. 

from tkinter import * 
from tkinter import messagebox
root = Tk()
root.geometry("300x200")
w = Label(root, text ='Mesaj Alanı', font = "50") 
w.pack()
messagebox.showinfo("showinfo", "Information")
messagebox.showwarning("showwarning", "Warning")
messagebox.showerror("showerror", "Error")
messagebox.askquestion("askquestion", "Are you sure?")
messagebox.askokcancel("askokcancel", "Want to continue?")
messagebox.askyesno("askyesno", "Find the value?")
messagebox.askretrycancel("askretrycancel", "Try again?")  
root.mainloop() 

Python Windows Mesage Box (popup)

Python List Comprehension

Python List Comprehension liste içinde yapılacak basit işlemlerin tek satırda yapılmasını sağlayan bir yöntemdir. Örneğin sayılar içinden pozitif sayıları bulan ve bir fazlasını yazan kodu klasik ve List Comprehension yöntemleri ile yapalım.

ör:

Klasik Yöntem:

sayilar=[1,2,3,4,5,0,-1,-2,-3,-4,-5]

pozitif=[]

for sayi in sayilar:

    if sayi >=0:

        pozitif.append(sayi+1)

pozitif

List Comprehension:

pozitif=[x +1 for x in sayilar if x >=0]

pozitif

Python String Buffer Tanımlama ve Flush

Python yazılımı içinde string buffer tanımlama ihtiyacı olursa bu parametreyi tanımlarken bazı durumlara dikkat etmek gerekir. String Buffer özelliği Buffer’da değiştirilebilir bir karekter dizisi oluşturur. Oluşturulan dizi String gibidir fakat ondan farkı değişebilir olmasıdır. Hafızada her seferinde yeni bir alan açılmadan var olan alan üzerinde değişiklik yapılabilir. StringBuffer dizisine (array) bileşen ekleyen, bileşen silen, uzunluğu değiştiren ve başka işleri yapan çok sayıda metot vardır. StringBuffer thread-safe yani synchronized ‘tır. Bu durum da StringBuffer’ı thread’li işlemlerde kullanılmasını güvenli yapar. String buffer şu şekilde tanımlanır.

from ctypes import create_string_buffer
item = create_string_buffer(buffer size)

Ör: item = create_string_buffer(128)

Bu şekilde tanımladığınızda bazı sorunlar ile karşılaşabilirsiniz. Aşağıdaki gibi tanımlamanız daha sorunsuz bir sonuç ortaya çıkaracaktır.

item = create_string_buffer('\000' * 128)

Bu tanım string buffer için yeterlidir fakat gönderdiğiniz değişken tipi tutarlı olmazsa Type Error hatası alabilirsiniz. Bunu da düzeltmek için aşağıdaki halini kullanabilirsiniz. 

create_string_buffer(('\000' * bufferSize).encode())

ör:

item = create_string_buffer(('\000' * 128).encode())

Python orjinal buffer size'a bakmak için aşağıdaki komut kullanılabilir.

import io
print('Original buffer size:', io.DEFAULT_BUFFER_SIZE)

Çıktısı:

Original buffer size: 8192

Buffer'daki bilgileri silmek için

import sys
sys.stdout.flush()

Kodu kullanılabilir. Bu kod buffer'da bulunan verinin silinmesini sağlar, tabiki çıkış yönündeki veriyi silecektir. Bir print işlemi yapıyorsanız bufferda kalan veri böylece silinmiş olur. Bir print çıktısı sonrası buffer silinmek isteniyorsa

print(veri, end =' ', flush = True)

Şeklinde de yazdırma sonrası buffer silinebilir.

Spyder ve PyCharm için Python Versiyon Değişikliği

Kullandığınız Spyder veya PyCharm editörleri bilgisayarınızda buldukları default Python versiyonu ile çalışırlar. Bilgisayarınıza farklı bir Python versiyonu kurduğunuzda bu editörlerin bu versiyonla çalışması için bir değişiklik gerekiyor. Bir projeyi veya editörün default ayarlarını değiştirerek tüm projeleri farklı Python versiyonları ile yazabilirsiniz. Bir sonraki versiyon bir önceki versiyon özelliklerini desteklediğinden en son versiyonu yükledikten sonra editör defaultta bu versiyonda çalışmıyorsa aşağıdaki ayarlamayı yapmalısınız.

PyCharm Yazılımı için

Proje versiyonunu değiştirmek için:

File | Settings | Project: <project name> | Python Interpreter for Windows and Linux

PyCharm | Preferences | Project: <project name> | Python Interpreter for macOS

Default Python versiyonunu değiştirmek için:

File | New Projects Setup | Settings for New Project for Windows and Linux

File | New Projects Setup | Preferences for New Project for macOS

Spyder yazılımı için:

Tools | Preferences | Python Interpretor

Spyder için bu işlemi yaptıktan sonra yeni versiyon için aşağıdaki modülü indirmeyi unutmayın.

pip install spyder-kernels







Python'ı Komut Satırında Çalıştırmak

Python yazılımını kurarken Path bilgisini Enviroment'a ekleyen seçeneği seçmediyseniz windows işletim sisteminde komut satırında python veya pip yazdığınızda yazılım çalışmayacaktır. Bilgisayar içinde yerini bulup o klasöre girdikten sonra komut satırında çalıştırılabilir. Python ve uygulamalarını komut satırında çalıştırmak için sonradan da Path bilgisini girebilirsiniz. Bunun için;

Windows System Properties alanına girin. Bu alan Ayarlar > Advanced System Settings altındadır. Bu alana girdikten sonra Advanced sekmesini seçin. Sağ alt köşede bulunan Envirroment Variables butonuna tıklayın. System Variables alanına Python ve Python/script directorlerini Path değişkeni altına girin.

Path değişkenini seçin ve edit butonuna tıklayın. Listeye bilgisayarınızdaki yerlerini ekleyin.

Ör:

C:\Users\(kullanıcı Kılasörü)\AppData\Local\Programs\Python\Python310\

C:\Users\(kullanıcı Kılasörü)\AppData\Local\Programs\Python\Python310\Scripts

Ekledikten sonra bilgisayarınızı reboot etmeniz yeterli. Artık python komutlarını istediğiniz yerde yazabilirsiniz.

C:\Users>python

Python 3.10.7 (tags/v3.10.7:6cc6b13, Sep  5 2022, 14:08:36) [MSC v.1933 64 bit (AMD64)] on win32

Type "help", "copyright", "credits" or "license" for more information.

>>>


Python Mouse Hareketi Sağlayan Kod

 Aşağıdaki kod mouse kursörünün ekran üzerinde belirtilen koordinaya sol klik yapmasını sağlayan otomatik olarak tetiklenmesi gereken bir veya birden çok butona basmak için yazılmış bir koddur. Ekranın sol üst kısmı 0,0 olmak üzere pixel'ler belirtilerek butonlara tıklanabilir.


import win32api, win32con

import time

def click(x,y):

    win32api.SetCursorPos((x,y))

    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,x,y,0,0)

    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,x,y,0,0)

while True:

    click(100,100)

    time.sleep(5)

    click(200,200)

    time.sleep(5)

    click(300,300)

    time.sleep(5)

    click(500,500)

    time.sleep(5)

    click(600,600)


Diğer mouse hareketleri için;

https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-mouse_event


Python ile Oracle Veri Tabanına Veri Yazma

 Python Oracle modulü ile aşağıdaki kodu kullanarak Oracle veri tabanına veri girişi yapabilirsiniz. Bu uygulamada bir fonksiyon gönderilen SQL sorgusunu çalıştırmaktadır. Bu fonksiyon ile farklı SQL sorguları da çalıştırabilirsiniz.


import cx_Oracle


def InservDB(inserquery):
    try:
        conn = cx_Oracle.connect('username/Password@hostname:1521/NOR')
        cursor = conn.cursor()
        cursor.execute(inserquery)
        #cursor.executemany(inserquery)
        conn.commit()
        cursor.close()
        conn.close()
        return 0
    except ValueError:
        print("Database bağlantısı sağlanamıyor...")

inserquery = "insert into Tablo_adı(Sutun1, Sutun2, Sutun3) values(1,2,3)"
InsertDB(inserquery)

Oracle SQL Sorgusunu Python script ile çalıştırma.

Python Oracle Database Bağlantısı

 Python ile Oracle veri tabanına bağlanmak için ilk olarak Pyhon oracle modülünü yüklemeniz gerekmektedir. Python Oracle kütüphanesinin adı cx_Oracle dır. Bu kütüphaneyi pip ile yükleyin.

pip install cx_Oracle

Modülü kurduktan sonra oracle sitesinden driverları indirip bilgisayarınıza kopyalayın. 

64 bit

https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html

32 bit

https://www.oracle.com/database/technologies/instant-client/microsoft-windows-32-downloads.html

Yazdığınız koda Oracle modülünü import edin ve driver'ı bir defaya mahsus gösterin.

import cx_Oracle

cx_Oracle.init_oracle_client(lib_dir=r"C:\oracle\instantclient_19_11")

Şimdi connect() fonksiyonunu kullanarak Python programı ile Oracle veritabanı arasında bir bağlantı kurun.

con = cx_Oracle.connect('username/password@localhost')

Bir SQL sorgusu yürütmek ve sonuç sağlamak için, cursor() nesnesi gerekir.

cursor = conn.cursor()

Daha sonra komutları işleteceğiniz bölümü oluşturun.

cursor.execute(sqlquery) – – – -> tek bir sorgu yürütmek için.

cursor.executemany(sqlqueries) – – – -> birden çok bağlama değişkeni/yer tutucu ile tek bir sorgu yürütmek için.

Tüm işlemler tamamlandıktan sonra tüm işlemlerin kapatılması zorunludur.

cursor.close()

con.close()

Örnek Kod

# importing module
import cx_Oracle
 # Create a table in Oracle database
try:
     con = cx_Oracle.connect('tiger/scott@localhost:1521/xe')
    print(con.version)
 
    # Now execute the sqlquery
    cursor = con.cursor()
 
    # Creating a table employee
    cursor.execute("create table employee(empid integer primary key, name varchar2(30), salary number(10, 2))")
 
    print("Table Created successfully")
 
except cx_Oracle.DatabaseError as e:
    print("There is a problem with Oracle", e)
 
# by writing finally if any error occurs
# then also we can close the all database operation
finally:
    if cursor:
        cursor.close()
    if con:
        con.close()

Python ile Dosya Ekli Email Gönderme

 Python ile bir excel dosyasını e-mail olarak göndermek istiyorsanız aşağıdaki kodu kullanabilirsiniz. 


import smtplib,ssl
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import formatdate
from email import encoders
def send_mail(send_from,send_to,subject,text,files,server,port,username='',password='',isTls=True):
    msg = MIMEMultipart()
    msg['From'] = send_from
    msg['To'] = send_to
    msg['Date'] = formatdate(localtime = True)
    msg['Subject'] = subject
    msg.attach(MIMEText(text))
    part = MIMEBase('application', "octet-stream")
    part.set_payload(open("WorkBook3.xlsx", "rb").read())
    encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename="WorkBook3.xlsx"')
    msg.attach(part)
    #context = ssl.SSLContext(ssl.PROTOCOL_SSLv3)
    #SSL connection only working on Python 3+
    smtp = smtplib.SMTP(server, port)
    if isTls:
        smtp.starttls()
    smtp.login(username,password)
    smtp.sendmail(send_from, send_to, msg.as_string())
    smtp.quit()

Python ile Hava Durumu Bilgisi

Python kullanarak openweathermap.org sitesinin API arayüzünü kullanarak hava durumu bilgisi alabilirsiniz. İlk olarak siteye üye olup bir API key oluşturmanız gerekiyor. Daha sonra aşağıda bulunan Python scripti kullanarak istediğiniz yerin hava durumu bilgisini alabilirsiniz.

Python Kod;

import requests, json 

api_key = "KEY"
base_url = "http://api.openweathermap.org/data/2.5/weather?"
city_name = "İstanbul
complete_url = base_url + "appid=" + api_key + "&units=metric&q=" + city_name 
response = requests.get(complete_url) 
x = response.json() 
if x["cod"] != "404": 
    data = json.loads(response.text)
    print(data)
    coord_lon=data["coord"]["lon"]
    coord_lat=data["coord"]["lat"]
    weather_id=data["weather"][0]["id"]
    weather_main=data["weather"][0]["main"]
    weather_description=data["weather"][0]["description"]
    weather_icon=data["weather"][0]["icon"]
    base=data["base"]
    main_temp=data["main"]["temp"]                  #Metric: Celsius
    main_feels_like=data["main"]["feels_like"]      #Metric: Celsius
    main_temp_min=data["main"]["temp_min"]          #Metric: Celsius
    main_temp_max=data["main"]["temp_max"]          #Metric: Celsius
    main_pressure=data["main"]["pressure"]          #Atmospheric pressure hPa
    main_humidity=data["main"]["humidity"]          #%
    visibility=data["visibility"]
    wind_speed=data["wind"]["speed"]                #Default: meter/sec
    wind_deg=data["wind"]["deg"]                    #deg
    clouds_all=data["clouds"]["all"]                #Cloudiness, %
    dt=data["dt"]
    sys_type=data["sys"]["type"]
    sys_id=data["sys"]["id"]
    sys_country=data["sys"]["country"]
    sys_sunrise=data["sys"]["sunrise"]
    sys_sunset=data["sys"]["sunset"]
    timezone=data["timezone"]
    id=data["id"]
    name=data["name"]
    cod=data["cod"]
    print(coord_lon, coord_lat, weather_id, weather_main, weather_description, weather_icon, base, main_temp, main_feels_like, main_temp_min, main_temp_max, main_pressure,
          main_humidity, visibility, wind_speed, wind_deg, clouds_all, dt, sys_type, sys_id, sys_country, sys_sunrise, sys_sunset,
          timezone, id, name, cod)
else: 
    print("City Not Found ")

Hava durumu API http://api.openweathermap.org/

Python Selenium Uygulaması

Python ile herhangi bir web sayfasını açıp, sayfaya login olup, istediğiniz sayfaya gidip, formu doldurup gönderebilirsiniz. Bunu sağlayabilen selenium kütüphanesi için Google'ı açıp istediğiniz bir kelimeyi arama yapabilen bir örnek kod paylaşıyorum. Bot yapmak için çok esnek olan bu modülü kullanmanızı tavsiye ederim.

Modülü kullanabilmek için Firefox veya Chrome driver'ını bilgisayarınıza indirip aşağıdaki gibi yerini göstermeniz gerekiyor, kurulum gerektiren bir dosya değil. Aşağıdaki örnek Chrome driver ile yapılmıştır.

-------------------

import time

from selenium import webdriver

driver = webdriver.Chrome('c:\directory\chromedriver.exe')  

driver.get('http://www.google.com/');

time.sleep(5) # Let the user actually see something!

search_box = driver.find_element_by_name('q')

search_box.send_keys('ChromeDriver')

search_box.submit()

time.sleep(5) 

driver.quit()

-------------------

Tüm driver dosyaları için;

https://pypi.org/project/selenium/ 

Python ile Kelime veya Cümleleri String Olarak Birleştirme

Python'da cümleleri, kelimeleri veya sayıları bir string olarak birleştirebilmek için aşağıdaki methodlardan herhangi birini kullanabilirsiniz. Bunların tamamı aynı sonucu verecektir.


name ='Serkan'

age = 18


"I am " + name + " and I am " + str(age) + " years old."

I am Serkan and I am 18 years old.


"I am %s and I am %d years old." %(name, age)

I am Serkan and I am 18 years old.


"I am {} and I am {} years old." .format(name, age)

I am Serkan and I am 18 years old.


f"I am {name} and I am {age} years old."

I am Serkan and I am 18 years old.

Google