Dün gece, bir dizindeki tüm dosyaları okuyup işleyen bir otomasyon botu yazıyordum. Her şey harika gidiyordu, os.walk() ile güzelce geziyor, dosyaları bir güzel işliyordu. Ta ki... o gizli dosyaya gelene kadar.
Bot, bir anda pat diye durdu. Terminalde kocaman bir PermissionError: [Errno 13] Permission denied hatası. Kafayı yiyecektim! "Ne izni kardeşim, ben adminim!" diye bağırdım monitöre. Meğerse sorun, dizinde bulunan ve adı nokta (.) ile başlayan gizli bir .temp_analysis_cache dosyasıymış. Sistem onu okumama/belki de yazmama izin vermemiş.
Kodum basitti ve bu ihtimali hiç düşünmemiştim:
Python:
for root, dirs, files in os.walk(target_folder):
for file in files:
with open(os.path.join(root, file), 'r') as f: # İşte patlama burada!
data = f.read()
# ... işlemler
StackOverflow'da bile tam bu senaryoyu bulamadım. Çözüm, her dosyayı açmaya çalışırken bir try-except bloğu sarmalı oluşturmak ve hata vereni sessizce atlamakta (ya da loglamakta) yattı. Ayrıca, dosya adının nokta ile başlayıp başlamadığını da kontrol edebilirsin.
İşte düzelttiğim hali:
Python:
for root, dirs, files in os.walk(target_folder):
for file in files:
file_path = os.path.join(root, file)
try:
with open(file_path, 'r', encoding='utf-8') as f:
data = f.read()
# ... başarılı işlemler
except (PermissionError, IOError) as e:
print(f"Atlanıyor {file_path}: {e}")
continue # Bir sonraki dosyaya geç
Şaka gibi ama, bir bot yazarken sadece "normal" dosyaların var olacağını varsaymak büyük hata. Gizli dosyalar (.temp, .git, .DS_Store), kilitli dosyalar, sembolik linkler... Hepsi zinciri kırabilir. Artık file handling yaparken ilk işim, olası tüm hataları yakalayacak sağlam bir try-except yapısı kurmak oldu.
Siz de böyle "Benim dizinimde öyle dosya yok ki!" deyip sonra gizli bir dosya yüzünden saatlerce debug yaptığınız oldu mu? Bu tarz durumlarda sizin tercih ettiğiniz daha temiz/şık bir yöntem var mı?