Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce sisteminizde Python 3.12 veya daha güncel bir sürümün kurulu olduğundan emin olmalısınız. Bağımlılıkları yönetmek için sanal ortam (virtual environment) kullanmak, projenizin izolasyonunu sağlayacaktır.
Gerekli kütüphaneleri yüklemek için terminalinizde şu komutu çalıştırın:
pip install pandas pillow reportlab
Bu kütüphaneler; pandas veri manipülasyonu (CSV/JSON), pillow görüntü işleme (PNG/JPG), reportlab ise PDF oluşturma işlemleri için kullanılacaktır. Kurulum sonrası ortamınızın hazır olduğunu doğrulamak için python --version komutunu kullanabilirsiniz.
Dosya Yönetimi ve Dizin Yapısını Kurma
Çoklu dönüştürme işlemlerinde en kritik adım, kaynak dosyaların bulunduğu dizini ve çıktıların kaydedileceği hedef dizini doğru yönetmektir. Python'un yerleşik os ve pathlib modülleri, dosya yollarını işletim sisteminden bağımsız olarak yönetmenizi sağlar.
Aşağıdaki kod bloğu, belirtilen klasördeki dosyaları listeleyip çıktı dizinini hazırlar:
import os
from pathlib import Path
def klasor_hazirla(kaynak, hedef):
hedef_yolu = Path(hedef)
if not hedef_yolu.exists():
hedef_yolu.mkdir(parents=True)
print(f"{hedef} dizini oluşturuldu.")
return [f for f in Path(kaynak).iterdir() if f.is_file()]
# Kullanım:
dosyalar = klasor_hazirla("kaynak_dosyalar", "cikti_dosyalar")
print(f"İşlenecek {len(dosyalar)} dosya bulundu.")
Bu yapı, kodunuzun farklı işletim sistemlerinde (Windows, Linux, macOS) hata almadan çalışmasını sağlar. pathlib kullanımı, geleneksel os.path yöntemine göre daha okunabilir ve modern bir yaklaşımdır.
CSV'den JSON'a Veri Dönüştürme
Veri formatları arasında en sık yapılan işlemlerden biri, tablo yapısındaki CSV dosyalarını web uygulamalarında daha yaygın kullanılan JSON formatına çevirmektir. Pandas kütüphanesi bu işlemi tek satırda yapabilmemize olanak tanır.
import pandas as pd
def csv_to_json(dosya_yolu, hedef_yolu):
df = pd.read_csv(dosya_yolu)
json_adi = Path(dosya_yolu).stem + ".json"
df.to_json(Path(hedef_yolu) / json_adi, orient='records', indent=4)
print(f"{json_adi} başarıyla oluşturuldu.")
# Örnek çağrı:
# csv_to_json("veri.csv", "cikti_dosyalar")
Burada kullanılan orient='records' parametresi, JSON çıktısının bir liste içerisinde nesneler şeklinde olmasını sağlar. Bu format, çoğu API ve frontend framework'ü ile tam uyumludur.
Görüntü Formatlarını Dönüştürme (PNG/JPG)
Görsel dosyalar üzerinde işlem yaparken Pillow (PIL) kütüphanesi en güvenilir araçtır. Farklı formatlardaki görselleri standart bir formata (örneğin JPEG) dönüştürmek, depolama alanından tasarruf sağlar.
from PIL import Image
def resim_donustur(dosya_yolu, hedef_format="JPEG"):
resim = Image.open(dosya_yolu)
yeni_ad = Path(dosya_yolu).stem + "." + hedef_format.lower()
resim.convert("RGB").save(f"cikti_dosyalar/{yeni_ad}", hedef_format)
print(f"{yeni_ad} kaydedildi.")
# Kullanım:
# resim_donustur("foto.png")
Dikkat edilmesi gereken nokta, PNG gibi şeffaflık barındıran formatları JPEG'e çevirirken convert("RGB") metodunu kullanmaktır; aksi takdirde şeffaf alanlar siyah renge dönüşebilir.
Karşılaştırmalı Format Dönüştürme Yöntemleri
| Format Türü | Kullanılan Kütüphane | Avantajı | Dezavantajı |
|---|---|---|---|
| CSV / JSON | Pandas | Hızlı ve büyük veri uyumlu | RAM kullanımı yüksek olabilir |
| PNG / JPG | Pillow | Geniş format desteği | İşlemci gücü gerektirir |
| Metin / PDF | ReportLab | Profesyonel çıktı | Karmaşık layout yönetimi |
Güvenlik ve Hata Yönetimi
Kritik Uyarı: Kullanıcıdan alınan dosya yollarını doğrudan işlemek, "Path Traversal" (yol geçişi) saldırılarına davetiye çıkarabilir. Dosya işlemlerinde mutlaka
os.path.basenameveyapathlibile dosya isimlerini temizleyin ve kullanıcı girdilerini asla doğrudan sistem komutlarına parametre olarak göndermeyin.
Ayrıca, büyük dosyaların dönüştürülmesi sırasında programın çökmemesi için try-except blokları kullanmak, yazılımınızın kararlılığını artıracaktır.
def guvenli_donustur(islem_fonksiyonu, dosya):
try:
islem_fonksiyonu(dosya)
except Exception as e:
print(f"Hata oluştu: {dosya.name} - {e}")
# Kullanım:
# guvenli_donustur(csv_to_json, "hatali_dosya.csv")
Sıkça Sorulan Sorular
Python ile dönüştürme yaparken dosya boyutu sınırı var mı?
Python'un kendisinde bir sınır yoktur, ancak kullandığınız kütüphaneler (özellikle Pandas) tüm veriyi RAM'e yükleyebilir. Çok büyük dosyalar için "chunking" (parçalı okuma) yöntemini kullanmalısınız.
PDF dönüştürme işlemi neden yavaş?
PDF oluşturma, metin ve görselin koordinat sistemine göre yerleştirilmesini gerektiren yoğun bir işlemdir. Karmaşık layoutlar oluşturuyorsanız işlem süresi artabilir.
Farklı dosya formatlarını aynı anda nasıl işlerim?
Dosya uzantılarını kontrol eden bir if-elif yapısı veya bir sözlük (dictionary) eşlemesi kullanarak, dosya uzantısına göre ilgili fonksiyonu çağıran bir ana döngü kurabilirsiniz.
Dönüştürme sonrası orijinal dosyaları silmeli miyim?
Üretim ortamında (production) orijinal dosyaları silmek yerine, onları bir "arşiv" klasörüne taşımak en güvenli yöntemdir. Veri kaybını önlemek için doğrudan silme komutlarından kaçının.
Bu scripti web arayüzüne nasıl bağlarım?
Bu arka plan scriptini Flask veya FastAPI gibi bir framework ile sarmalayarak, kullanıcıların dosya yükleyip dönüştürülmüş halini indirebileceği bir web servisine dönüştürebilirsiniz.
Performans Optimizasyonu: Multiprocessing ile Paralel İşleme
Dönüştürme işlemlerinde dosya sayısı arttıkça, Python'un standart sıralı (sequential) çalışma mantığı darboğaz oluşturabilir. İşlemci yoğunluklu (CPU-bound) görevlerde, özellikle yüksek çözünürlüklü görselleri işlerken multiprocessing modülünü kullanarak tüm çekirdekleri verimli bir şekilde kullanabilirsiniz.
Aşağıdaki örnekte, bir dizindeki tüm görselleri eş zamanlı olarak dönüştüren bir yapı kurguluyoruz:
import multiprocessing
from PIL import Image
import os
def convert_image(file_path):
# Görseli aç ve dönüştür
img = Image.open(file_path)
new_path = file_path.replace(".png", ".jpg")
img.convert("RGB").save(new_path, "JPEG")
return f"{file_path} dönüştürüldü."
if __name__ == "__main__":
files = ["resim1.png", "resim2.png", "resim3.png"] # Örnek dosya listesi
# İşlemci çekirdek sayısına göre havuz oluştur
with multiprocessing.Pool(processes=multiprocessing.cpu_count()) as pool:
results = pool.map(convert_image, files)
for result in results:
print(result)
Argparse ile Profesyonel CLI (Komut Satırı Arayüzü) Geliştirme
Scriptinizi bir araç haline getirmek için kullanıcıdan dinamik parametreler almanız gerekir. argparse kütüphanesi, kullanıcıya yardım menüsü sunan ve komut satırından argüman almayı kolaylaştıran standart bir çözümdür.
Bu yapı sayesinde kullanıcı, scripti çalıştırırken kaynak dizini ve hedef formatı belirleyebilir:
import argparse
def main():
parser = argparse.ArgumentParser(description="Çoklu Dosya Dönüştürücü CLI")
parser.add_argument("--input", required=True, help="Kaynak dizin yolu")
parser.add_argument("--format", choices=['json', 'jpg', 'pdf'], required=True, help="Hedef format")
args = parser.parse_args()
print(f"İşlem başlatılıyor: {args.input} dizinindeki dosyalar {args.format} formatına çevrilecek.")
if __name__ == "__main__":
main()
CLI Kullanım İpuçları
- Yardım Menüsü: Kullanıcı
python script.py --helpyazdığında otomatik olarak oluşturulan açıklama metnini görür. - Zorunlu Parametreler:
required=Trueparametresi ile kullanıcının eksik bilgi girmesini engelleyebilirsiniz. - Seçenek Kısıtlama:
choicesparametresi, kullanıcının sadece desteklediğiniz formatları girmesini zorunlu kılar.
Profesyonel Not: CLI aracınızı geliştirirken logging modülünü kullanarak işlemlerin durumunu bir dosyaya yazdırın. Bu, uzun süren toplu dönüştürme işlemlerinde hata takibi yapmanızı kolaylaştırır.
Sonuç
Bu rehberde, Python kullanarak nasıl esnek ve modüler bir dosya formatı dönüştürücü oluşturacağınızı öğrendiniz. pathlib ile dosya yollarını yönetmeyi, pandas ve pillow gibi kütüphanelerle veri ve görsel manipülasyonu yapmayı adım adım uyguladık. Yazılım dünyasında otomasyon, verimliliğin anahtarıdır.
Bir sonraki adım olarak, bu projeyi bir komut satırı arayüzüne (CLI) dönüştürmek için argparse kütüphanesini inceleyebilir veya dönüştürme işlemlerini hızlandırmak için multiprocessing modülü ile paralel işleme mantığını araştırabilirsiniz. Kodunuzu her zaman hata yönetimi ve güvenlik prensipleriyle geliştirmeyi unutmayın.
Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Ticari veya kritik sistemlerde kullanmadan önce dosya izinlerini, bellek yönetimini ve güvenlik açıklarını (özellikle kullanıcı girişi olan sistemlerde) profesyonel bir denetimden geçirmeniz önerilir.


Yorumlar (0)
Yorum Yaz