Dostlar, az kalsın bugün bir trajedi yaşanıyordu. Şu klasik işi yapan bir Python scripti yazıyordum: Bir CSV dosyasını oku, bazı sütunları işle, temizlenmiş halini yeni bir dosyaya yaz. Basit, rutin bir iş. Ama işte o rutin dediğin...
Mantık şuydu: `data.csv` dosyasını okuyacak, işleyecek ve sonuçları `data_cleaned.csv` olarak kaydedecektim. İşlem başarılı olursa, eski ve kirli olduğunu düşündüğüm orijinal `data.csv` dosyasını silecektim. "Temiz bir çalışma ortamı" değil mi? Kod aşağı yukarı şöyle başlıyordu:
Python:
import pandas as pd
import os
df = pd.read_csv('data.csv')
# ... bir sürü işlem ...
df.to_csv('data_cleaned.csv', index=False)
os.remove('data.csv') # İşte o lanet satır!
Sorun, o "bir sürü işlem" kısmında patlak verdi. Bir sütunu tarihe çevirmeye çalışıyordum ve içinde beklenmedik, berbat formatlı bir değer vardı. Pandas, doğal olarak hata fırlattı. Ama benim o kodu çalıştırdığım an, `data_cleaned.csv` henüz oluşmamıştı bile! Yani script hata verip durdu, ama `os.remove('data.csv')` satırına GELMEDEN önce durdu. Eğer o satır daha yukarıda olsaydı, veya ben hatayı yakalayıp da dosyayı yine de silmeye kalkışsaydım, hem işlenmemiş hem de orijinal verimi kaybedecektim. Kafayı yiyecektim cidden.
Meğerse sorun şuradaymış: Silme işlemini, YENİ dosyanın başarıyla oluştuğundan EMİN OLMADAN asla yapmamalıymışım. StackOverflow'da bile bulamadığım bu basit gerçeği acı tecrübeyle öğrendim. Şimdi izlediğim yol şu:
1. Orijinal dosyayı oku.
2. İşle.
3. Yeni dosyayı geçici bir isimle (`data_cleaned_TEMP.csv`) veya farklı bir dizine kaydet.
4. Yeni dosyanın varlığını ve boyutunu kontrol et.
5. Ancak her şey tamamsa, isteğe bağlı olarak eski dosyayı sil veya yedekle.
Yani o kritik kısım şuna döndü:
Python:
try:
df.to_csv('data_cleaned_TEMP.csv', index=False)
# Dosya var mı, boş mu diye basit bir kontrol
if os.path.exists('data_cleaned_TEMP.csv') and os.path.getsize('data_cleaned_TEMP.csv') > 0:
os.rename('data_cleaned_TEMP.csv', 'data_cleaned.csv') # Atomik işlem gibi
# os.remove('data.csv') # ARTIK burada, ve isteğe bağlı!
else:
raise Exception("Oluşan dosya geçersiz!")
except Exception as e:
print(f"Hata! Orijinal dosya korundu. Detay: {e}")
# Geçici dosyayı temizle
if os.path.exists('data_cleaned_TEMP.csv'):
os.remove('data_cleaned_TEMP.csv')
Şaka gibi ama, bu basit hata bana veri bütünlüğünün ne kadar önemli olduğunu bir kez daha hatırlattı. Siz de böyle "az kalsın" diyeceğiniz, orijinal verinizi silmeye ramak kaldığınız anlar yaşadınız mı? Bu işi daha temiz yapan bir pattern biliyor musunuz?