İçeriğe geç
Muhammet Şafak
en
Diller 2 dk okuma

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.

Kapak görseli — karanlık masada robot kol, metal bir plakadaki klavye anahtarlarını mor ışık altında teker teker yerine basıyor; arkada dizüstü ve defter yığını

Bu yazı 4 yıl önce yazıldı — o günün koşullarını yansıtır.


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.

Bu konudaki deneyler

Bir Sentry issue'sunu çalışan koda karşı analiz eden, düzeltmeyi diff ve regresyon testiyle sunan, onay almadan dosyaya dokunmayan Claude Code skill'i.

Şu an ne yapıyor

Bir Sentry issue'sunu çalışan koda karşı okuyup kök neden analizi ve düzeltme planı çıkarıyor; onay alınmadan tek bir dosyaya dokunmuyor. Claude Code kullanan ve prodüksiyon hatasını triyaj etmek isteyen herkes skill'i kurabilir.

Açık kaynak Python Bash Sentry API +3 daha
Temmuz 2026 — Devam ediyor

Dile özgü serileştirme yerine dondurulmuş bir JSON zarfı; polyglot kuyruk standardı BabelQueue'ya dönüştü.

Şu an ne yapıyor

Dondurulmuş JSON zarfı dört dilde — PHP, Python, Go, Node.js — aynı baytları okutuyor; sidecar ya da broker eklentisi gerekmiyor. Polyglot kuyruk kuran ekipler spesifikasyonu ve SDK'ları bugün kullanabilir.

Açık kaynak JSON Redis RabbitMQ +4 daha
Mart 2026 — Haziran 2026
Etiketler: #Python
Uzmanlık: Python Geliştirici
Paylaş:

Yorumlar

Yorum yapmak için GitHub hesabınızla giriş yapmanız yeterli. Yorumlar GitHub Discussions üzerinde saklanır.

İlgili Yazılar

Sitede Ara

Yazı, proje ve sayfalarda arama yapmak için yazmaya başlayın.

Esc ile kapat Pagefind ile güçlendirildi