Python ile klasör isimlerini topluca değiştirin

2-3 haftadır Python çalışıyorum tekrardan ve bu sefer bir çok şey öğrendim. Öğrendiğim yeni bilgileri sizlerle paylaşayım dedim. Uzun zamandır aklımı meşgul eden bir konu vardı onu Python sayesinde halletim bu sayede. Şimdi kısaca bilgisayarımda fotoğraflarla dolu 20-30 tane klasör var, bunları da hep şu şekilde yazmıştım:

Almanya_ekim_2007
Bolum_temmuz_2006
Bilmemne_hede_höde_2008

Fakat sonraları baktım ki bu biçim bana uygun değil,sondaki yıl ibarelerini en başa getirirsem çok daha uygun olacağını anladım, yani şu şekilde bir şey:

2007_almanya_ekim
2006_bolum_temmuz
2008_bilmemne_hede_höde

Haliyle bir sürü klasör olunca hepsini elle teker teker yapmak yerine bir tane küçük Python betiği yazayım ve kendisi hepsini değiştirsin dedim. İlk önce yazdığım betik aşağıdaki gibi:

  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3.  
  4. import os, re
  5.  
  6. def renamer():
  7.     for filename in os.listdir(os.curdir):     
  8.         if re.search('(\w)_(\d)', filename):
  9.             m = re.compile('([a-z_]*)_([0-9]*)', re.IGNORECASE)
  10.             names  = m.search(filename)
  11.             newfilename = names.group(2) + '_' + names.group(1).lower()
  12.             print newfilename
  13.             #os.rename(filename, newfilename)
  14.  
  15. if __name__ == '__main__':
  16.     renamer()

Betiği klasörleri değiştirmek istediğimiz klasörün içinde çalıştırmamız lazım. Kısaca yaptığı adımlar şunlar(satır numaralarına göre):

  • Satır 7: Klasörün içindeki klasörlerin bir listesini çıkartıyor, ve teker teker isimleri alıyor
  • Satır 8: Eğer klasörlerin sonunda sayılar varsa devam et, yoksa hiç bir şey yapma
  • Satır 9: Klasör isimlerini için bir tane regex ifadesi yazıyoruz.
  • Satır 10:Ardından bu regex ifadesi için bizim klasör’ler aranıyor ve ona göre bulunuyor
  • Satır 11:Bulunduktan sonra names.group() şeklinde bunlara ulaşabiliyoruz, bunlarla da istediğimiz şekildeki yeni dosyamızı oluşturuyoruz, ben 2008 + _ + dosya_deneme şeklinde yaptım, sizler farklı yapabilirsiniz tabi.
  • Satır 12:İstediğimi ifadeler doğru çıkıyor mu, çıktısına bakalım
  • Satır 13:Eğer doğru ise bu satırın önünde # ifadesini kaldıralım.

Öğrendiklerim bazı noktalar var, örneğin regex ifadelerini kesinlikle çok iyi bilmek lazım. Örneğin 9′uncu satırdaki ifade’yi irc’de acemi’den aldım. Ondan önce re.split ile bir yöntem denemiştim fakat tam istediğim gibi olmadı. O yüzden bu gibi işlemler için regex ile aranız ne kadar iyi olursa sizin için daha iyi olacaktır. Örneğin 8′inci satırdaki if durumunu kitaptan bakarak yaptım ve istediğim şekilde çalıştı. \w tüm alfabetik harfler demek, \d ise tüm sayılar demek. Yani eğer harfler_sayılar şeklinde bir dosya ismi var ise filename içinde o zaman devam edecek, yoksa betik hiç bir şey yapmayacak. Ayrıca büyük harfleri küçük harflere dönüştürmek için sadece .lower() ifadesini ekledim, aynı şekilde yeni bir isim oluşturmak tıpkı lego taşları ile oynamak kadar kolay. Gerçekten sevilesi bir dil Python.

Betiği düzgün bir şekilde çalıştıdıktan sonra, sonuçlar da şu şekilde olacaktır:

Python Betik

Ayrıca bu betik yazdığım ilk Python betiği özelliğini taşıyor. O yüzden ki bir sürü hata ya da gereksiz kod parçası olma olasılığı çoktur. Onun dışında Python ile cidden kısa zamanda güzel işler yapabilirsiniz, zaten kullandıkça yeni şeyler öğrenmemek elde değil. Bakalım zaman ne gösterecek inşallah zamanla çok daha farklı şeyler öğrenmiş oluruz.

Etiketler: , , , , , ,

Benzer Yazılar


6 tane Yorum yapılmış

  1. Uğur SAMSA @ April 4, 2008

    Eline sağlık. Zor işleri kolaylaştırmak güzel bir duygudur herhalde.

  2. acemi @ April 4, 2008

    Bu isi rename komutu ile de yapabilirsin. Ilk parametre olarak regex ile neyin neyle degisecegini yaziyorsun; ikinci parametre olarak da hangi dosyalarin bundan etkilenecegini yaziyorsun.

    * butun dosyalar anlamina geliyor.

    rename ’s/([a-z_]*)_([0-9]*)/$2_$1/’ *

  3. Fatih Arslan @ April 4, 2008

    @Uğur Samsa

    Evet en azından bana öyle oluyor, aslında zamanımı aldı fakat python ile yazmak istediğimden illa öğrenmek istemiştim, iyi de oldu hani

    @acemi

    İpucu için teşekkürler, öğrendiğim iyi oldu. Başka alternatif arayışlara girmemiştim, doğrudan bu işi python ile yapmak istediğimden bu şekilde yazdım.

  4. Heartsmagic @ April 4, 2008

    Nedense Lapis içinde olan böyle ufak projelerin ilk ‘tester’ı hep ben oluyorum :)
    Eline sağlık Fatih.

  5. Emre Saglam @ April 4, 2008

    Ben de fotograflarimi duzenlemek icin (daha dogrusu arsivlemek icin) Buna benzer bir python programi yazmistim.

    Benim icin onemli olan fotonun cekildigi yili/ayi bulup onu o yil icindeki ay klasorune atmakdi, Daha sonra bunlari 2000 DVD’si, 2001 DVDsi şeklinde yakıp, arşivlemekti.

    Programina buna benzer bi ekleme yapabilirsin eger biraz daha python calismak istiyorsan ;)
    Ipuclari: python EXIF library ve de recursive programlama ;)

  6. Fatih Arslan @ April 4, 2008

    @Heartsmagic

    Sana da teşşekür ederim serkan abi, hani olmazsan bu kadar uğraşmazdım galiba :)
    @Emre Sağlam

    Exif bilgisini almak da çok mantıklı aslında, iyi fikir. En kısa zamanda bu şekilde bir eklemeyi yapmaya çalışayım. Dediğin gibi Python hakkında daha fazla bilgi edinirim bu sayede. Fikir için teşekkürler :)

Buradan yorum bırakabilirsiniz