Klasörler ve dosyalar direkt olarak çalıştığınız bilgisayardaki kaynaklara erişimi gerektirir. Bu kişisel bilgisayarınızda olabilir, bir sunucu da. Ama her neresi olursa olsun işletim sistemi ile iletişim kurabileceğiniz bir Python modülüne ihtiyacınız olacak: OS modülü.

Yeni Klasör Oluşturmak

Yeni klasör oluşturmak için os modülü bize 2 benzer metod sunar; mkdir() ve makedirs(). Bunlardan ilki belirttiğiniz konumda bir klasör oluştururken, ikincisi birden fazla klasörü iç içe oluşturabilir.

import os

os.mkdir("yenidizin")

Yukarıdaki örnek bulunduğunuz klasör içinde yenidizin isimli bir klasör oluşturur.

 

import os

os.makedirs("egitim/python/nesneye dayalı programlama", mode=0o755, exist_ok=True)

Bu örnekte de bulunduğunuz klasör içinde verdiğiniz yapıda klasör iç içe oluşturulur. Burada ek parametreler ile oluşturulacak klasörlerin erişim yetkilerini de belirledik. Erişim yetkileri sırasıyla; kullanıcı, grup ve diğerleri olarak dosyada hangi yetkiler ile neler yapılabileceğini belirler. Okuma(r) yetkisi 4, yazma(w) yetkisi 2 ve çalıştırma(x) yetkisi 1 olmak üzere toplanarak bulunur. Dosyanın 755 yetkisine sahip olması demek; sahip olan kullanıcının 7 = okuma 4 + yazma 2 + çalıştırma 1 yetkisine sahip olması demektir. Kullanıcının içinde bulunduğu grup yetkileri ise 5 = okuma 4 + yazma 0 + çalıştırma 1 olarak belirlenmiştir. Yani gruptaki bir başka kullanıcı bu dosyayı okuyabilir, çalıştırabilir ama dosyayı düzenleyemez, çünkü yazma yetkisi yoktur. Diğerleri ise yine 5 yetkisi ile okuyabilir ve çalıştırabilir ama düzenleyemez. Örneğin bir dosyaya sahip olan kullanıcısından başkasının erişmesini istemiyorsak dosya erişim yetkisini 700 olarak belirleyebiliriz. Böylece gruptaki diğer kullanıcılar da, dışarıdan herhangi bir kullanıcı da erişim yetkisi 0 = Okuma 0 + Yazma 0 + Çalıştırma 0 olduğu için dosyayı açıp okuyamaz, düzenleyemez ya da çalıştıramaz.

exist_ok=True parametresi ise, oluşturmak istediğimiz klasör daha önceden mevcutsa hata almamızın önüne geçer.

 

Klasörün İçeriğini Keşfetmek

Herhangi bir klasörün içeriğini görmek için os modülünün scandir() ya da listdir() metodlarını kullanırız;

import os

tarama=os.scandir("/home/chaos/Eğitim/Python/python-dersleri")
for belge in tarama:
    print(belge.name)

Çıktı:

kumeler.zip
d2
sozlukler.zip
demetler.zip
Listeler.zip
d1

Öncelikle içindeki sınıf ve fonksiyonları kullanacağımız modülü dosyamıza dahil ettik. Daha sonra os.scandir() metoduyla elde ettiğimiz sonuçları bir değişkene atadık. Bu değişken bir nesnedir ve biz bu nesnenin sadece name özelliğine ulaşmak istiyoruz. Sonuçta da klasörün içindeki dosya ve klasörlerin isimlerini for..in döngüsüyle ekrana yazdırdık.

Bu kodumuzu daha sağlıklı hale getirmenin yolu bağlam yöneticileri ile with..as ifadesi içinde kullanmaktır. Çünkü, işletim sistemi kaynakları, RAM tüketimi, veritabanı bağlantı lilmiti gibi sınırlı kaynaklara erişirken işimiz bittiğinde kullandığımız kaynakları boşaltmak iyi bir programlama alışkanlığıdır. Böylece kaynak tüketen uygulamalarınız çalıştığınız sistemlere zarar vermez ve performans sorunları yaşamazsınız.

Yani aynı kodumuzu şu şekilde yazmak daha iyi bir kodlama örneğidir;

import os

with os.scandir("/home/chaos/Eğitim/Python/python-dersleri") as tarama:
    for belge in tarama:
        print(belge.name)

Size aynı sonucu verecektir ancak sistem kaynakları için endilelenmeniz gerekmez, çünkü bağlam yönetici işiniz bittiğinde sizin yerinize kaynakları serbest bırakacaktır.

Sonuçta hedef klasör içindeki alt kalsörler ve dosyaların isimlerine ulaştık. Ama bu istediğiniz sonuç olmayabilir. Çünkü dosya uzantıları olmazsa eğer dosyaları kalsörlerden ayırt etmenizin bir yolu yoktur. Eğer dosya ve klasörleri siz oluşturduysanız önceden hangisinin ne olduğunu biliyorsunuzdur ama ya tanımadığınız bir sistem üzerinde çalışıyorsanız? Bu durumda dosyaları, klasörlerden ayırt etmenin bir yolu olmalı.

Bunun için os modülünün is_file() isimli metodu nesnenin bize dosya olup olmadığını verecektir;

with os.scandir("/home/chaos/Eğitim/Python/python-dersleri") as tarama:
    for belge in tarama:
        if belge.is_file():
            print(belge.name)

Çıktı:

kumeler.zip
sozlukler.zip
demetler.zip
Listeler.zip

 

Peki dosyalar yerine sadece alt klasörleri görmek isteseydik? Bunun için de is_dir() metodu mevcut;

with os.scandir("/home/chaos/Eğitim/Python/python-dersleri") as tarama:
    for belge in tarama:
        if belge.is_dir():
            print(belge.name)

Çıktı:

d2
d1

 

Dosya ve Klasörlerin Özellikleri

Python’da dizinlerin ve dosyaların özelliklerine erişiebilmemiz için de os modülünün stat() metodu mevcuttur;

print("d1 isimli klasörün özellikleri: ", os.stat("/home/chaos/Eğitim/Python/python-dersleri/d1"))
print("sozlukler.zip isimli dosyanın özellikleri: ", os.stat("/home/chaos/Eğitim/Python/python-dersleri/sozlukler.zip"))

Çıktı:

d1 isimli klasörün özellikleri: os.stat_result(st_mode=16893, st_ino=8102842, st_dev=2055, st_nlink=4, st_uid=1000, st_gid=1000, st_size=4096, st_atime=1606823018, st_mtime=1604247229, st_ctime=1604247229)
sozlukler.zip isimli dosyanın özellikleri: os.stat_result(st_mode=33204, st_ino=7133582, st_dev=2055, st_nlink=1, st_uid=1000, st_gid=1000, st_size=1718, st_atime=1606133258, st_mtime=1605945923, st_ctime=1605945926)

Ya da klasör içindeki tüm dosya ve klasörlerin özelliklerini görmek için döngülerden faydalanablirsiniz;

with os.scandir("/home/chaos/Eğitim/Python/python-dersleri") as tarama:
    for belge in tarama:
        print(belge.name , " isimli klasör/dosya özellikleri: " , os.stat(belge))

Çıktı:

kumeler.zip isimli klasör/dosya özellikleri: os.stat_result(st_mode=33204, st_ino=7102601, st_dev=2055, st_nlink=1, st_uid=1000, st_gid=1000, st_size=1806, st_atime=1606133257, st_mtime=1605874310, st_ctime=1605874320)
d2 isimli klasör/dosya özellikleri: os.stat_result(st_mode=16893, st_ino=8102845, st_dev=2055, st_nlink=2, st_uid=1000, st_gid=1000, st_size=4096, st_atime=1606823018, st_mtime=1604766060, st_ctime=1604766060)
sozlukler.zip isimli klasör/dosya özellikleri: os.stat_result(st_mode=33204, st_ino=7133582, st_dev=2055, st_nlink=1, st_uid=1000, st_gid=1000, st_size=1718, st_atime=1606133258, st_mtime=1605945923, st_ctime=1605945926)
demetler.zip isimli klasör/dosya özellikleri: os.stat_result(st_mode=33204, st_ino=7115886, st_dev=2055, st_nlink=1, st_uid=1000, st_gid=1000, st_size=1226, st_atime=1606133258, st_mtime=1605874642, st_ctime=1605874648)
Listeler.zip isimli klasör/dosya özellikleri: os.stat_result(st_mode=33204, st_ino=7093915, st_dev=2055, st_nlink=1, st_uid=1000, st_gid=1000, st_size=3097, st_atime=1606133257, st_mtime=1605874332, st_ctime=1605874336)
d1 isimli klasör/dosya özellikleri: os.stat_result(st_mode=16893, st_ino=8102842, st_dev=2055, st_nlink=4, st_uid=1000, st_gid=1000, st_size=4096, st_atime=1606823018, st_mtime=1604247229, st_ctime=1604247229)

 

Çıktıda yer alan bilgiler ise şunlardır;

  • st_mode: Dosya türünü ve dosya modu bitlerini gösterir(yetkilendirmeler).
  • st_ino: Linux tabanlı sistemlerde inode numarasını Windows tabanlı sistemlerde ise dosya indeksini gösterir.
  • st_dev: Dosyanın bulunduğu aygıtın tanımlayıcı bilgisini gösterir.
  • st_nlink: Bu dosya/dizine yapılan sabit bağlantıların sayısını gösterir.
  • st_uid: Dosya sahibinin kullanıcı kimlik numarasını gösterir.
  • st_gid: Dosya sahibinin grup kimlik numarasını gösterir.
  • st_size: Bytes cinsinden dosya boyutunu gösterir.
  • st_atime: En son erişim zamanını saniye olarak gösterir.
  • st_mtime: En son düzenleme zamanını saniye olarak gösterir.
  • st_ctime: Linux sistemlerde en son meta veri değişiklik zamanını, windows sistemlerde oluşturulma zamanını saniye olarak gösterir.
  • st_atime_ns: Bu bilgi st_atime ile aynıdır ama zamanı nanosaniye cinsinden tamsayı olarak gösterir.
  • st_mtime_ns: Bu bilgi st_mtime ile aynıdır ama zamanı nanosaniye cinsinden tamsayı olarak gösterir.
  • st_ctime_ns: Bu bilgi st_ctime ile aynıdır ama zamanı nanosaniye cinsinden tamsayı olarak gösterir.
  • st_blocks: Dosya için ayrılan 512 baytlık blokların sayısını gösterir.
  • st_rdev: Bir inode cihazı ise, cihazın türünü gösterir.
  • st_flags: Dosya için kullanıcının tanımladığı işaretleri gösterir.

Bu verilerin çoğu gördüğünüz gibi anlaşılır formatta değillerdir. İnsanlar yerine makinelere anlam ifae edecek istatistiklerdir. Ama bir miktar kod yazarak insanlar tarafından okunup anlaşılabilir formata çevirebilirsiniz.

Örneğin, dosyaya son erişim zamanını saniyeden bildiğimiz tarih formatına dönüştürebiliriz. Bunun için datetime nodülünü kullanmamız gereklidir;

import os
from datetime import datetime

def tarihe_cevir(veri):
    d = datetime.utcfromtimestamp(veri)
    okunabilir_tarih = d.strftime("%d %b %Y")
    return okunabilir_tarih

son_duzenleme=os.stat("/home/chaos/Eğitim/Python/python-dersleri/sozlukler.zip").st_mtime
sonuc=tarihe_cevir(son_duzenleme)
print("sozlukler.zip isimli dosyanın son düzenlenme tarihi: ", sonuc)

Çıktı:

sozlukler.zip isimli dosyanın son düzenlenme tarihi: 21 Nov 2020

 

Klasörleri Silmek

Eğer bir klasörü silmek isterseniz de aynı modülün rmdir() fonksiyonunu kullanabilirsiniz. Ancak içinde dosya ya da alt-klasör olan klasörleri silemeyeceğinizi unutmayın. Önce içeriğini boşaltmalı, sonra klasörleri silmelisiniz.

import os
os.rmdir("silinecek-klasor")

 

Klasörlerin alt klasörlerini ve içindeki dosyalarını nasıl bulacağınızı ileride “Dosya ve Dizin Arama İşlemleri” konusunda detaylıca anlattım. O konuyu da okuyunca şu anda aklınızda beliren “eğer klasörler boş değilse, içeriğini nasıl görebilirim ve nasıl silebilirim” gibi soruların cevapları aydınlanmış olacaktır.

Ancak klasörün içeriğinde ne olduğunu zaten biliyorsanız ya da sizin için önemli değilse, bir klasörü alt klasörüleri ve dosyalarıyla birden toplu olarak silmek için shutil modülünde yer alan rmtree() fonksiyonunu kullanabilirsiniz.

import shutil

shutil.rmtree("silinecek_klasör")

 

Bu konudaki kodları şurada görebilirsiniz;

https://repl.it/@ObenSEVEN/dizin-islemleri