Python ile otomasyon: tekrarlayan işleri betiğe dökmek
Manuel iş akışlarını güvenilir Python betiklerine taşımak: hangi işler betiklenmeye değer ve bunu nasıl doğru yaparsınız.
Bir iş akışını üçüncü kez elle yaptığınızda bir şey olmalı: betiği yazmalısınız. Bu kural her dilde geçerli ama Python bu iş için özellikle iyi bir eşleşme sunuyor — sözdizimi az, standart kütüphanesi geniş, ekosistemi bu tür işlere yönelik.
Bu yazıda tekrarlayan işleri betiğe dökmek üzerine düşüncelerimi ve pratikte kullandığım birkaç kalıbı paylaşmak istiyorum. Büyük otomasyon frameworkleri veya orkestrasyon araçları değil; somut, elle tutulur betikler.
Neyin betiklenmeye değer olduğunu tanımak
Her tekrarlayan iş betiklenmeye değmez. Şu soruları soruyorum:
- Bu iş ne sıklıkla yapılıyor? Haftada bir değil, günde birkaç kez ya da her gün olmalı.
- Adımları sabit mi, yoksa her seferinde farklı karar gerektiriyor mu? Sabit adımlı işler betiklenebilir; karar ağırlıklı işler değil.
- Hata riski var mı? Elle yapıldığında adım atlamak, yanlış klasöre yazmak, bir dosyayı silmek mümkün mü?
Evet yanıtları biriktikçe betiğin değeri artıyor.
Dosya işleme: basit ama sık karşılaşılan
Bir klasördeki dosyaları belirli bir kurala göre yeniden adlandırmak, belirli uzantıları başka bir klasöre taşımak, çok sayıda CSV dosyasını birleştirmek — bunlar Python standart kütüphanesiyle dakikalar içinde yazılabilen işler.
import os
import shutil
from pathlib import Path
def move_by_extension(source_dir: str, target_dir: str, extension: str) -> int:
source = Path(source_dir)
target = Path(target_dir)
target.mkdir(parents=True, exist_ok=True)
moved = 0
for file in source.glob(f"*.{extension}"):
dest = target / file.name
if dest.exists():
print(f"Atlandı (zaten var): {file.name}")
continue
shutil.move(str(file), str(dest))
moved += 1
return moved
if __name__ == "__main__":
count = move_by_extension("./indirilenler", "./arsiv/pdf", "pdf")
print(f"{count} dosya taşındı.")
pathlib kullanımını tercih ediyorum — os.path yerine daha okunabilir ve nesne yönelimli. shutil.move taşıma işini platformdan bağımsız yapıyor.
Dış API’lerden veri çekme
Üçüncü taraf bir servisten düzenli veri çekip işlemeniz gereken durumlar çok yaygın. Python’un requests kütüphanesi bu işi son derece kolaylaştırıyor:
import requests
import json
from datetime import datetime
def fetch_and_save(api_url: str, output_file: str) -> None:
response = requests.get(api_url, timeout=10)
response.raise_for_status() # 4xx/5xx durumlarında hata fırlatır
data = response.json()
with open(output_file, "w", encoding="utf-8") as f:
json.dump({
"fetched_at": datetime.utcnow().isoformat(),
"count": len(data),
"data": data,
}, f, ensure_ascii=False, indent=2)
print(f"{len(data)} kayıt kaydedildi: {output_file}")
raise_for_status() küçük ama önemli bir alışkanlık. Sessiz başarısızlıkları önlüyor — yanıt 200 değilse erken ve açık bir hatayla karşılaşıyorsunuz, veri işleme kısmında değil.
Betiklerde güvenilirlik için birkaç alışkanlık
Betik yazmak hızlı; güvenilir betik yazmak biraz daha dikkat gerektiriyor.
Idempotency (aynı sonucu yeniden üretebilme): Betik iki kez çalıştırıldığında ikincisi birincinin yaptığını bozmamalı. Dosya zaten varsa atla, veri zaten işlendiyse geç. Yukarıdaki örnekteki if dest.exists(): continue bunun küçük ama iyi bir örneği.
Hata yönetimi: try/except her yere koymak değil, başarısız olduğunda neyin başarısız olduğunu açıkça anlamak. İstisna (exception) mesajı yeterli bilgiyi taşımalı.
Çalışma kaydı: Özellikle zamanlanmış betikler için basit bir log mekanizması. print yeterli çoğu durumda; daha önemli betikler için Python’un logging modülü.
Argüman desteği: Sabit değerleri kodun içine gömmeyin. argparse veya sys.argv ile betik dışarıdan parametreler alabilsin. Bu hem test edilebilirliği artırıyor hem de farklı ortamlarda kullanımı kolaylaştırıyor.
import argparse
parser = argparse.ArgumentParser(description="Dosya taşıma betiği")
parser.add_argument("source", help="Kaynak klasör")
parser.add_argument("target", help="Hedef klasör")
parser.add_argument("--ext", default="pdf", help="Dosya uzantısı (varsayılan: pdf)")
args = parser.parse_args()
PHP veya Go yerine Python ne zaman
Bu üç dille çalışıyorum ve otomasyon işlerinde çoğunlukla Python’a gidiyorum. Gerekçe basit: Python’un standart kütüphanesi bu tür işler için hazır. csv, json, os, shutil, pathlib, argparse, logging — ekstra bağımlılık olmadan çok iş yapılabiliyor.
PHP de yazılabilir elbette; ama PHP’nin çalışma modeli web isteklerine yönelik. Betik çalıştırma için de kullanılabiliyor, ama ekosistem bu yöne odaklanmamış. Go’nun binary dağıtımı güçlü bir avantaj, ama küçük iç araçlar için derleme döngüsü ekstra sürtünme yaratıyor.
Python hızla yazar, hızla değiştirirsiniz ve çalışır. Betiğin güvenilirliği ve okunabilirliği için birkaç basit alışkanlık yeterli. Bu iş için doğru araç.
Tekrarlayan iş görüyorsanız betiği yazın. Sonra o betiği tekrar yazılabilir ve güvenilir hale getirin. Bu döngü zamanla çok ciddi bir verimlilik birikimi oluşturuyor.