Dijital müzik arşivleri büyüdükçe, içinde kaç adet MP3 dosyası olduğunu bilmek hiç de kolay değildir. Özellikle yıllar içinde biriken binlerce şarkı, podcast, sesli kitap ve kayıt, klasörler ve alt klasörler arasında dağılır.
Bu yazıda, Python programlama dilini kullanarak herhangi bir klasör ve tüm alt klasörlerinde kaç MP3 dosyası olduğunu bulan basit ama güçlü bir betiği adım adım inceleyeceğiz.
Kodumuz şu şekildedir:
import os
def mp3_say(klasor):
toplam = 0
for kok, altklasörler, dosyalar in os.walk(klasor):
for dosya in dosyalar:
if dosya.lower().endswith('.mp3'):
toplam += 1
return toplam
klasor_yolu = "mp3"
if os.path.exists(klasor_yolu):
sayi = mp3_say(klasor_yolu)
print(f"'{klasor_yolu}' klasöründe toplam {sayi} adet MP3 dosyası bulundu.")
else:
print(f"Hata: '{klasor_yolu}' klasörü bulunamadı!")
Bu yazı boyunca:
- Kodun her satırını teknik olarak çözümleyecek,
os.walkfonksiyonunun nasıl çalıştığını detaylandıracak,- Gerçek dünyadan kullanım senaryoları sunacak,
- Kodun üzerine ekleyebileceğin gelişmiş özellikleri anlatacak,
- Hata yönetimi, performans iyileştirmeleri ve farklı format desteği ekleyeceğiz.
🧠 1. Python ve Dosya Sistemi ile Tanışma
Python, dosya sisteminde gezinmek için os ve pathlib gibi güçlü modüller sunar. Biz os.walk tercih ettik çünkü:
- Rekürsif (özyinelemeli) çalışır: Bir klasörün içindeki tüm alt klasörleri otomatik olarak tarar.
- Hafiftir: Büyük dizinlerde bile makul düzeyde hızlıdır.
- Platform bağımsızdır: Windows, Linux, macOS’ta aynı şekilde çalışır.
os.walk(klasor) her adımda size üç değer döndürür:
kok(root) → Şu anda taradığı klasörün tam yolu.altklasörler(dirs) → Bu klasörün altındaki klasörlerin listesi.dosyalar(files) → Bu klasörün içindeki dosyaların listesi.
Bu üçlü sayesinde hiçbir dosyayı kaçırmadan ilerleyebiliriz.
🔍 2. Kodun Adım Adım Çalışma Prensibi
📁 2.1. Klasör Varlığını Kontrol Etme
if os.path.exists(klasor_yolu):
Bu satır, belirtilen klasörün gerçekten var olup olmadığını kontrol eder. Eğer klasör yoksa, kullanıcıya anlaşılır bir hata mesajı gösterilir.
Neden önemli?
Eğer bu kontrol olmasaydı, var olmayan bir klasör için os.walk çağrıldığında Python hata fırlatır ve program çökerdi.
🔁 2.2. os.walk ile Dolaşma
for kok, altklasörler, dosyalar in os.walk(klasor):
Örneğin, "mp3" klasörü şu yapıya sahip olsun:
mp3/
├── rock/
│ ├── song1.mp3
│ └── song2.mp3
├── pop/
│ └── hit.mp3
└── audiobook/
└── chapter1.mp3
os.walk sırasıyla şu değerleri üretecektir:
kok = "mp3",dosyalar = [](belki direkt dosya yoksa boş)kok = "mp3/rock",dosyalar = ["song1.mp3", "song2.mp3"]kok = "mp3/pop",dosyalar = ["hit.mp3"]kok = "mp3/audiobook",dosyalar = ["chapter1.mp3"]
🎯 2.3. MP3 Filtreleme
if dosya.lower().endswith('.mp3'):
Burada .lower() sayesinde "SONG.MP3", "Song.Mp3" gibi farklı yazım şekilleri de yakalanır..endswith('.mp3') ise dosya adının sonunun .mp3 ile bitip bitmediğini kontrol eder.
➕ 2.4. Sayacı Artırma
toplam += 1
Her bulunan MP3 için sayaç bir artar.
🔁 2.5. Sonucu Döndürme ve Yazdırma
return toplam
Fonksiyon, toplam MP3 sayısını geri verir. Ardından bu sayı ekrana yazdırılır.
🛠️ 3. Kodun Geliştirilmiş Hali (Önerilerle Birlikte)
Sadece MP3 saymak yerine daha fazlasını yapmak isteyebilirsiniz. İşte geliştirilmiş sürüm:
import os
def mp3_bilgi(klasor):
toplam = 0
boyut_toplam = 0
mp3_listesi = []
for kok, altklasörler, dosyalar in os.walk(klasor):
for dosya in dosyalar:
if dosya.lower().endswith('.mp3'):
tam_yol = os.path.join(kok, dosya)
mp3_listesi.append(tam_yol)
toplam += 1
boyut_toplam += os.path.getsize(tam_yol)
return toplam, boyut_toplam, mp3_listesi
klasor_yolu = "mp3"
if os.path.exists(klasor_yolu):
sayi, boyut, liste = mp3_bilgi(klasor_yolu)
print(f"Toplam MP3: {sayi}")
print(f"Toplam boyut: {boyut / (1024**2):.2f} MB")
print(f"İlk 5 dosya: {liste[:5]}")
else:
print("Klasör bulunamadı.")
Bu geliştirme ile:
- Toplam disk kullanımını öğrenirsin.
- Hangi dosyaların sayıldığını görebilirsin.
- Büyük arşivlerde raporlama yapabilirsin.
🧪 4. Gerçek Hayat Kullanım Senaryoları
🎧 4.1. Müzik Koleksiyonunuzu Analiz Etme
Eğer bilgisayarınızda "Müzik" adlı bir klasör varsa ve altında sanatçı/albüm şeklinde düzenlenmiş MP3’leriniz varsa, bu betikle toplam parça sayısını anında öğrenebilirsiniz.
📁 4.2. Taşınabilir Disk veya SD Kart Kontrolü
MP3 çalarınıza veya telefonunuza kaç şarkı sığdığını merak ediyorsanız, diskin yolunu verip çalıştırmanız yeterlidir.
🗂️ 4.3. Yedekleme Öncesi Raporlama
Bir klasörü yedeklemeden önce içinde ne kadar MP3 olduğunu bilmek, yedekleme süresini tahmin etmenizi sağlar.
🔎 4.4. Yinelenen Dosya Tespitine Hazırlık
MP3 listesini bir dosyaya yazıp, daha sonra aynı isimde veya aynı boyutta dosyaları tespit edebilirsiniz.
⚠️ 5. Hata Yönetimi ve Sağlamlık
Gerçek dünyada her şey beklendiği gibi çalışmaz. İşte karşılaşabileceğin sorunlar ve çözümleri:
🚫 Erişim Engeli (PermissionError)
Bazı klasörlere erişim iznin olmayabilir. Bunu try-except ile yakalayabilirsin:
try:
for kok, altklasörler, dosyalar in os.walk(klasor):
...
except PermissionError:
print(f"Erişim engeli: {kok}")
🧩 Kırık Sembolik Linkler
os.walk varsayılan olarak sembolik linklere girmez, ancak followlinks=True ile girebilir. Bu durumda sonsuz döngü riskine karşı dikkatli ol.
🧪 Büyük Dosya Adları
Bazı işletim sistemlerinde dosya adları bozuk karakterler içerebilir. try-except ile dosya adını okumayı dene.
⚡ 6. Performans Analizi
100.000 MP3 dosyası olan bir diskte bu betik ne kadar sürer?
os.walkoldukça optimize edilmiştir.- Her dosya için
endswithkontrolü çok hızlıdır. - Asıl zaman, diskin hızına ve dosya sayısına bağlıdır.
İpucu: Eğer sadece sayıyı istiyorsan, dosya listesini bellekte tutma. Yukarıdaki gelişmiş sürümde liste tutmak büyük arşivlerde bellek kullanımını artırır.
🌍 7. Platform Farklılıkları
| Platform | Klasör yolu örneği | Büyük/küçük harf duyarlılığı |
|---|---|---|
| Windows | "C:\\Müzik\\mp3" | Duyarsız (MP3 = mp3) |
| Linux | "/home/kullanici/mp3" | Duyarlı |
| macOS | /Users/kullanici/mp3 | Genelde duyarsız (APFS) |
.lower().endswith('.mp3') sayesinde tüm platformlarda sorunsuz çalışır.
📦 8. Alternatif Yaklaşımlar
🐍 pathlib ile modern yaklaşım
from pathlib import Path
def mp3_say_pathlib(klasor):
return len(list(Path(klasor).rglob("*.mp3")))
print(mp3_say_pathlib("mp3"))
- Daha okunabilir
- Nesne tabanlı
.rglobile tüm alt klasörler taranır
Ancak os.walk daha ince kontrol sağlar (örneğin belirli alt klasörleri atlama).
🧩 9. Sıkça Sorulan Sorular (SSS)
❓ Bu kod sadece .mp3 uzantısını mı sayar?
Evet, ama .MP3, .Mp3 gibi varyasyonları da sayar. .wav veya .flac için koşulu değiştirebilirsiniz.
❓ Çok büyük klasörlerde bilgisayarımı yavaşlatır mı?
Hayır, çünkü dosyaları belleğe yüklemez, sadece isimlerini okur. Yine de çok yavaş bir diskte (ağ sürücüsü, USB 2.0) biraz zaman alabilir.
❓ MP3 olmayan dosyalar yanlışlıkla sayılır mı?
Hayır, çünkü sadece .mp3 ile bitenleri sayıyoruz.
❓ Sonuçları bir dosyaya nasıl kaydederim?
with open("mp3_raporu.txt", "w") as f:
f.write(f"Toplam MP3: {sayi}")
📈 10. Kodun Tümü (Gelişmiş Sürüm)
Aşağıda, hem MP3 sayan hem de her alt klasör için ayrı ayrı rapor veren, hata yönetimi yapılmış, tam teşekküllü sürümü bulacaksın:
import os
def mp3_say_detayli(ana_klasor):
print(f"\n📁 Taranan ana klasör: {ana_klasor}\n")
genel_toplam = 0
klasor_raporu = {}
for kok, altklasörler, dosyalar in os.walk(ana_klasor):
mp3_sayisi = 0
for dosya in dosyalar:
if dosya.lower().endswith('.mp3'):
mp3_sayisi += 1
if mp3_sayisi > 0:
klasor_raporu[kok] = mp3_sayisi
genel_toplam += mp3_sayisi
print("📊 Alt klasör bazlı MP3 sayıları:")
for klasor, sayi in klasor_raporu.items():
print(f" {klasor} → {sayi} MP3")
print(f"\n🎵 GENEL TOPLAM: {genel_toplam} MP3 dosyası")
return genel_toplam
if __name__ == "__main__":
klasor_yolu = "mp3"
if os.path.exists(klasor_yolu):
mp3_say_detayli(klasor_yolu)
else:
print(f"Hata: '{klasor_yolu}' klasörü bulunamadı!")
Bu sürüm:
- Her alt klasördeki MP3 sayısını tek tek gösterir.
- Ana klasörde hiç MP3 yoksa sadece genel toplam 0 yazılır.
- Hata yönetimi için genişletilebilir.
🎓 11. Öğrendiklerimiz
Bu yazı boyunca:
✅ os.walk ile dosya sisteminde gezinmeyi
✅ MP3 dosyalarını büyük/küçük harf duyarsız filtrelemeyi
✅ Klasör varlığını kontrol etmeyi
✅ Sayacı artırıp sonucu döndürmeyi
✅ Gelişmiş özellikler (boyut hesaplama, liste tutma, hata yönetimi) eklemeyi
✅ Gerçek hayat senaryolarını öğrendik.
🚀 12. Bundan Sonra Ne Yapılabilir?
İstersen bu betiği şu şekilde büyütebilirsin:
- Grafik arayüz (Tkinter / PyQt) ekleyerek sürükle-bırak ile klasör seçtirme.
- Çoklu format desteği:
.mp3, .wav, .flac, .m4asayma. - Çift (yinelenen) dosyaları bulma (aynı dosya adı ve boyutu).
- MP3 etiketlerini (ID3) okuma (sanatçı, albüm, yıl) ve raporlama.
- Web arayüzü (Flask) ile tarayıcıdan kullanma.
✅ Sonuç
Elimizdeki bu küçük Python betiği, sadece 11 satırda harika bir iş çıkarıyor: Bir klasör ağacındaki tüm MP3 dosyalarını saymak.
Üzerine eklediğimiz geliştirmelerle birlikte, bu betik artık sadece saymakla kalmıyor, aynı zamanda raporlama, hata yönetimi ve detaylı analiz yapabiliyor.
Umarım bu rehber, Python ile dosya sistemi işlemlerine sağlam bir giriş yapmanı sağlamıştır. Kendi ihtiyaçlarına göre betiği özelleştirmekten çekinme!