Dosya ve Klasör İşlemleri: os ve pathlib ile Toplu Yeniden Adlandırma
Bir önceki derste Python kurulumunu tamamlayıp değişkenler, döngüler ve fonksiyonlarla ilk küçük betiklerimizi yazmıştık. Artık elimizde çalışan bir Python ortamı ve temel sözdizimi bilgisi olduğuna göre, bu bilgiyi gerçek bir günlük soruna yöneltme zamanı geldi: bilgisayardaki dosya ve klasörleri programla yönetmek.
Bu derste ne yapacağız?
Bu derste, bir klasördeki dosyaları Python ile listeleyip belirli bir kritere göre filtreleyeceğiz ve ardından bu dosyaları toplu hâlde, düzenli bir isimlendirme kuralına göre yeniden adlandıran bir betik yazacağız. Bunu yaparken os ve pathlib modüllerini tanıyacak, ikisi arasındaki farkı göreceğiz. Ön koşul olarak bir önceki derste anlatılan temel Python bilgisine (değişken, döngü, koşul ifadesi, fonksiyon tanımlama) ve bilgisayarınızda Python'ın çalışır durumda olmasına ihtiyacınız var. Ayrıca üzerinde deneme yapabileceğiniz, önemli olmayan birkaç test dosyası içeren bir klasör hazırlamanız faydalı olacaktır.
Kavram
Gerçek hayatta yüzlerce fotoğrafı, faturayı veya raporu tek tek elle yeniden adlandırmayı düşünün; bu hem çok zaman alır hem de insan hatasına açıktır. Tıpkı bir depo görevlisinin yüzlerce kutuyu tek tek elle etiketlemesi yerine bir etiketleme makinesi kullanması gibi, biz de Python'a "bu klasördeki her PDF dosyasını sırayla numaralandırarak yeniden adlandır" gibi bir kural veririz ve program bunu saniyeler içinde, hatasız şekilde uygular.
os modülü, Python'ın işletim sistemiyle konuşmasını sağlayan eski ve temel bir kütüphanedir; dosya yolu, klasör listeleme, yeniden adlandırma gibi işlemleri metin (string) tabanlı olarak yapar. pathlib ise daha modern bir yaklaşımdır: dosya yollarını birer Path nesnesi olarak ele alır, bu sayede kod daha okunaklı ve daha az hataya açık hâle gelir. Günümüzde yeni yazılan kodlarda genellikle pathlib tercih edilir, ancak birçok eski proje ve kaynak hâlâ os modülünü kullandığı için ikisini de tanımak önemlidir.
Adım adım uygulama
Şimdi bir klasördeki tüm PDF dosyalarını bulup "fatura_001.pdf", "fatura_002.pdf" şeklinde sıralı olarak yeniden adlandıran bir betik yazalım. Arayüz görünümü kullandığınız düzenleyiciye (metin editörü, kod editörü) göre değişebilir; burada anlatılan adımlar genel bir mantığı izler.
- Bilgisayarınızda test amaçlı, içinde birkaç adet PDF veya başka uzantılı dosya bulunan bir klasör oluşturun; örneğin masaüstünde "test_dosyalar" adında bir klasör.
- Kod editörünüzde yeni bir Python dosyası oluşturun ve "yeniden_adlandir.py" gibi bir isim verin.
- Aşağıdaki tabloda satır satır açıklanan kodu, verilen sırayla dosyanıza yazın.
- Kodun içindeki klasör yolunu, kendi test klasörünüzün gerçek yoluyla değiştirin.
- Dosyayı kaydedin ve terminal veya komut satırından çalıştırın.
- Çalıştırdıktan sonra klasörü açıp dosya adlarının beklediğiniz gibi değiştiğini kontrol edin.
| Kod satırı | Ne işe yarar |
|---|---|
| from pathlib import Path | pathlib modülünden Path sınıfını içeri aktarır; dosya yollarıyla nesne tabanlı çalışmamızı sağlar. |
| klasor = Path("C:/Users/kullanici/Desktop/test_dosyalar") | Üzerinde çalışacağımız klasörü bir Path nesnesi olarak tanımlar. |
| uzanti = ".pdf" | Sadece hangi uzantıdaki dosyaların işleneceğini belirtir; bu sayede diğer dosyalar dokunulmadan kalır. |
| sayac = 1 | Yeni dosya adlarında kullanılacak sıra numarasını tutan sayacı başlatır. |
| for dosya in sorted(klasor.iterdir()): | Klasördeki tüm öğeleri (dosya ve alt klasörleri) alfabetik sırayla tek tek gezer. |
| if dosya.is_file() and dosya.suffix.lower() == uzanti: | Öğenin gerçek bir dosya olup olmadığını ve uzantısının aradığımız uzantıyla eşleşip eşleşmediğini kontrol eder. |
| yeni_ad = f"fatura_{sayac:03d}{dosya.suffix.lower()}" | Sayacı üç haneli, baştan sıfırlarla dolgulu bir biçimde kullanarak yeni dosya adını oluşturur (örneğin fatura_001.pdf). |
| yeni_yol = dosya.with_name(yeni_ad) | Aynı klasör içinde, sadece adı değişmiş yeni bir Path nesnesi üretir. |
| dosya.rename(yeni_yol) | Dosyayı fiilen yeni adıyla değiştirir; bu işlem geri alınamaz olduğu için dikkatli olunmalıdır. |
| print(f"{dosya.name} -> {yeni_ad}") | Hangi dosyanın hangi ada dönüştüğünü ekrana yazdırarak işlemi takip etmemizi sağlar. |
| sayac += 1 | Bir sonraki dosya için sayacı bir artırır. |
Dikkat edilmesi gereken önemli bir nokta şudur: rename işlemi gerçekleştiğinde eski dosya adı kalıcı olarak kaybolur ve geri alma (undo) özelliği yoktur. Bu nedenle betiği ilk kez çalıştırmadan önce mutlaka önemsiz test dosyaları üzerinde deneme yapmalı, gerçek ve değerli dosyalarınızın bir yedeğini almalısınız. Ayrıca betiği ilk aşamada sadece print satırıyla hangi adın hangi ada dönüşeceğini görmek için çalıştırıp, sonuçlardan emin olduktan sonra rename satırını devreye almak da güvenli bir yöntemdir.
os modülüyle aynı işi yapmak isteseydik, klasörü os.listdir() ile listeler, dosya yollarını os.path.join() ile birleştirir ve yeniden adlandırmayı os.rename() ile yapardık. Bu yöntem de çalışır, ancak yol birleştirme işlemlerini metin olarak elle yapmak gerektiğinden pathlib'e kıyasla daha fazla dikkat ister. Yeni projelerde pathlib'i tercih etmenizi, ancak internette veya eski kaynaklarda os tabanlı örneklerle karşılaştığınızda onları da okuyup anlayabilmenizi öneririz.
Sık karşılaşılan sorunlar
| Hata | Çözüm |
|---|---|
| FileNotFoundError: klasör bulunamadı | Path içine yazdığınız klasör yolunun gerçekten var olduğunu ve yazım hatası içermediğini kontrol edin; Windows'ta ters eğik çizgi yerine düz eğik çizgi kullanmak sorunları azaltır. |
| FileExistsError: hedef isimde zaten bir dosya var | Sayaç aynı isme birden fazla kez ulaşıyor olabilir; sayacın her dosyada bir artırıldığından ve klasörde daha önce aynı isimde dosya olmadığından emin olun. |
| Dosyalar beklenen sırada yeniden adlandırılmıyor | iterdir() sonucunu sorted() ile sıralamadan kullanmışsınızdır; sıralama yapılmazsa dosyalar işletim sisteminin verdiği rastgele sırayla işlenir. |
| PermissionError: erişim reddedildi | Dosya başka bir programda (örneğin PDF görüntüleyicide) açık olabilir; dosyayı kapatıp tekrar deneyin veya klasörde yazma izniniz olduğunu kontrol edin. |
| Beklenmeyen dosyalar da yeniden adlandırıldı | uzanti filtresinin doğru yazıldığından ve büyük/küçük harf farkını gidermek için .lower() kullanıldığından emin olun. |
Mini görev
Kendi bilgisayarınızda masaüstünde "otomasyon_gorev" adında yeni bir klasör oluşturun ve içine, adları karışık olan beş adet metin dosyası (.txt uzantılı, boş olabilir) koyun. Ardından bu derste öğrendiğiniz yöntemi kullanarak, bu klasördeki tüm .txt dosyalarını "gunluk_001.txt", "gunluk_002.txt" şeklinde sıralı olarak yeniden adlandıran bir betik yazın ve çalıştırın.
- Klasör ve beş test dosyası oluşturuldu mu?
- Betikte doğru klasör yolu ve doğru uzantı (.txt) tanımlandı mı?
- Betik önce sadece print ile denenip sonuçlar gözden geçirildi mi?
- rename satırı çalıştırıldıktan sonra klasördeki dosya adları kontrol edildi mi?
- Sayaç ve dosya adı biçimi (üç haneli, sıfır dolgulu) doğru şekilde uygulandı mı?
Kendini sına
- 1) pathlib modülündeki Path nesnesinin os modülüne göre temel avantajı nedir?
- 2) Bir klasördeki tüm dosya ve alt klasörleri gezmek için pathlib'te hangi metot kullanılır?
- 3) dosya.suffix.lower() ifadesinin amacı nedir?
- 4) rename() işlemi neden dikkatli kullanılmalıdır?
- 5) Yeniden adlandırma betiğini gerçek dosyalar üzerinde çalıştırmadan önce hangi güvenlik önlemi alınmalıdır?
Cevaplar
- 1) pathlib, dosya yollarını nesne tabanlı ve daha okunaklı biçimde ele alır; metin birleştirme hatalarını azaltır ve platformlar arası uyumluluğu kolaylaştırır.
- 2) klasor.iterdir() metodu, klasördeki tüm öğeleri gezmek için kullanılır.
- 3) Dosya uzantısını küçük harfe çevirerek, örneğin ".PDF" ile ".pdf" gibi büyük/küçük harf farklarından kaynaklanan filtreleme hatalarını önlemek içindir.
- 4) rename() işlemi geri alınamaz; yanlış bir isimlendirme kuralı, dosyaların eski adlarının kalıcı olarak kaybolmasına yol açabilir.
- 5) Önemsiz test dosyaları üzerinde deneme yapılmalı, gerçek dosyaların yedeği alınmalı ve betik önce sadece print ile kontrol edilmelidir.
Bu derste klasördeki dosyaları listeleyip toplu olarak yeniden adlandırmayı öğrendik. Bir sonraki derste bu dosya işleme becerilerimizi bir adım öteye taşıyarak Excel dosyalarını Python ile okuyup üzerinde otomatik işlemler yapmaya başlayacağız.
Bu dersi kayıt olmadan izleyebilirsin. İlerlemeni kaydetmek, sertifika almak ve puan tablosuna girmek için ücretsiz üye ol: Kayıt Ol