PYTHON // OTOMASYOND::02 BAŞLANGIÇ+
14m READCOMPLETION: 91%ID::PY-201

PYTHON OTOMASYON: OS VE VERİTABANI

pathlib, os modülü ve sqlite3 ile dosya/veri işlemleri

Python'un zengin standart kütüphanesi, harici paket kurmadan dosya sistemi operasyonları ve veritabanı işlemleri yapmanızı sağlar. pathlib, os ve sqlite3 modülleri, otomasyon script'lerinin bel kemiğini oluşturur.

pathlib — Modern Dosya Yolu Yönetimi

os.path modülü yerine Python 3.4+ ile gelen pathlib çok daha ergonomik bir API sunar:

// PYTHON //
from pathlib import Path
 
# Mevcut dizin
cwd = Path.cwd()
home = Path.home()
 
# Yol birleştirme — "/" operatörü ile!
config_dir = home / ".config" / "myapp"
log_file = cwd / "logs" / "app.log"
 
# Yol bilgileri
print(log_file.name)       # app.log
print(log_file.stem)       # app
print(log_file.suffix)     # .log
print(log_file.parent)     # /current/dir/logs
 
# Var mı kontrol
if not config_dir.exists():
    config_dir.mkdir(parents=True, exist_ok=True)
 
# Dosya okuma / yazma
content = log_file.read_text(encoding="utf-8")
log_file.write_text("Yeni içerik", encoding="utf-8")

Dizin Tarama ve Glob

// PYTHON //
from pathlib import Path
 
project = Path(".")
 
# Tek seviye
for py_file in project.glob("*.py"):
    print(py_file)
 
# Özyinelemeli arama
for mdx_file in project.rglob("*.mdx"):
    print(f"{mdx_file.stat().st_size:>10} bytes — {mdx_file}")
 
# Belirli desene uyan dosyaları listele
images = sorted(project.rglob("*.{png,jpg,webp}"))

Dosya Operasyonları

// PYTHON //
import shutil
from pathlib import Path
 
src = Path("source/report.csv")
dst = Path("archive/2026/report.csv")
 
# Hedef dizini oluştur
dst.parent.mkdir(parents=True, exist_ok=True)
 
# Kopyala (metadata dahil)
shutil.copy2(src, dst)
 
# Taşı
shutil.move(str(src), str(dst))
 
# Yeniden adlandır
old = Path("data.txt")
old.rename(old.with_stem(f"{old.stem}_backup"))
 
# Güvenli silme — önce kontrol
trash = Path("temp") / "old_log.txt"
if trash.is_file():
    trash.unlink()

os Modülü ile Sistem Bilgisi

// PYTHON //
import os
 
# Ortam değişkenleri
db_url = os.environ.get("DATABASE_URL", "sqlite:///local.db")
debug = os.environ.get("DEBUG", "false").lower() == "true"
 
# İşlem bilgisi
pid = os.getpid()
cpu_count = os.cpu_count()
 
# Kabuk komutu çalıştırma (subprocess tercih edin ama basit komutlar için)
exit_code = os.system("git status")
 
# Daha güvenli alternatif
import subprocess
result = subprocess.run(
    ["git", "log", "--oneline", "-5"],
    capture_output=True,
    text=True,
    check=True
)
print(result.stdout)

sqlite3 — Yerleşik Veritabanı

// PYTHON //
import sqlite3
from pathlib import Path
from contextlib import contextmanager
from typing import Iterator
 
DB_PATH = Path("data") / "app.db"
 
@contextmanager
def get_conn() -> Iterator[sqlite3.Connection]:
    conn = sqlite3.connect(DB_PATH)
    conn.row_factory = sqlite3.Row  # Sözlük benzeri erişim: row['name']
    conn.execute("PRAGMA journal_mode=WAL")  # Eş zamanlı okuma için
    conn.execute("PRAGMA foreign_keys=ON")
    try:
        yield conn
        conn.commit()
    except Exception:
        conn.rollback()
        raise
    finally:
        conn.close()

Şema Oluşturma ve CRUD

// PYTHON //
def init_db() -> None:
    with get_conn() as conn:
        conn.executescript("""
            CREATE TABLE IF NOT EXISTS urls (
                id        INTEGER PRIMARY KEY AUTOINCREMENT,
                url       TEXT    NOT NULL UNIQUE,
                title     TEXT,
                scraped   INTEGER DEFAULT 0,
                created   TEXT    DEFAULT (datetime('now'))
            );
            CREATE INDEX IF NOT EXISTS idx_urls_scraped ON urls(scraped);
        """)
 
def insert_url(url: str, title: str | None = None) -> int:
    with get_conn() as conn:
        cursor = conn.execute(
            "INSERT OR IGNORE INTO urls (url, title) VALUES (?, ?)",
            (url, title),
        )
        return cursor.lastrowid or 0
 
def get_pending(limit: int = 100) -> list[sqlite3.Row]:
    with get_conn() as conn:
        return conn.execute(
            "SELECT id, url FROM urls WHERE scraped = 0 LIMIT ?",
            (limit,),
        ).fetchall()
 
def mark_done(url_id: int) -> None:
    with get_conn() as conn:
        conn.execute(
            "UPDATE urls SET scraped = 1 WHERE id = ?",
            (url_id,),
        )

CSV ile Entegrasyon

Tam Otomasyon Script'i

// PYTHON //
#!/usr/bin/env python3
"""URL arşivleme otomasyon script'i."""
 
import sys
import logging
from pathlib import Path
 
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s",
)
log = logging.getLogger(__name__)
 
def main() -> int:
    DB_PATH.parent.mkdir(exist_ok=True)
    init_db()
    log.info("Veritabanı hazır: %s", DB_PATH)
 
    # CSV'den yükle
    csv_file = Path("input_urls.csv")
    if csv_file.exists():
        n = import_csv(csv_file)
        log.info("%d URL içe aktarıldı.", n)
 
    # Bekleyen URL'leri işle
    pending = get_pending(limit=50)
    log.info("%d URL işlenecek.", len(pending))
    for row in pending:
        log.info("İşleniyor: %s", row["url"])
        # scraping işlemi buraya...
        mark_done(row["id"])
 
    export_to_csv(Path("output.csv"))
    log.info("Dışa aktarma tamamlandı.")
    return 0
 
if __name__ == "__main__":
    sys.exit(main())

Sonuç

pathlib, os ve sqlite3 üçlüsü, Python otomasyon dünyasının temel taşlarıdır. Bu standart kütüphaneleri ustaca kullanmak, dış bağımlılık olmadan sağlam ve taşınabilir scriptler yazmanızı sağlar. Bir sonraki adımda bu bilgileri Playwright web scraping ile birleştireceğiz.