Ana sayfa » Python’da Os Modülü Kullanımı
Python

Python’da Os Modülü Kullanımı

os modülü

Python’da Os Modülü

Yazdığımız kodlar doğrultusunda geliştirdiğimiz programlarımız her zaman tek bir işletim sistemi üzerinde çalışmaya endeksli değillerdir. Bildiğiniz üzere bir program hem Linux hem Windows hem de bir Mac OS ortamında çalışabilir. Peki programlarımız farklı işletim sistemleri ile nasıl haberleşip uyum sağlayacak ? Bu soruya şöyle cevap verelim; her programlama dilinde de olduğu gibi Python bize işletim sistemi ile iletişim kurmamıza yarayan os modülü gibi bir modül sunmuş. Kısaca os modülü ile kullandığımız işletim sisteminde çeşitli işlemler yapabiliriz. Şimdi Python’un bize bahşettiği bu modül ile yapabileceklerimizi inceleyelim.

Os Modülü Fonksiyonları ve Nitelikleri

Os modülüne ait fonksiyonları ve nitelikleri incelemeden önce bundan önceki modüllerde de yaptığımız gibi modülümüzü import etmemiz gerekmektedir. Aşağıdaki şekilde modülümüzü import edelim.

import os

modülümüzü içeri aktardığımıza göre şimdi os modülene ait fonksiyonların ve niteliklerin işlevlerini inceleyebiliriz.

Name Niteliği

Python’da os modülene ait olan name niteliği ile kullandığımız işletim sisteminin ne olduğunu öğrenebiliriz. Örnek çıktılar üzerinden inceleyelim.

x = os.name
print(x)
---
'posix'

Eğer Linux kullanıcısı iseniz os.name kodumuzun çıktığı “posix” olacaktır. Windows’ta ise bu çıktı “nt” şeklindedir. Bu niteliği kullanarak kodumuzun içinde sadece Windows’ta çalışan veya sadece Linux’ta çalışan bölümler oluşturabiliriz. Günümüz programlarında “bu özellik sadece X işletim sistemi içindir” gibi uyarıların yer aldığını hepimiz biliyoruz. İşte bu ayrımın nasıl yapıldığını yavaş yavaş anladığınızı umuyorum.

Getcwd() Metodu

İnceleyeceğimiz ilk fonksiyon olan getcwd() fonksiyonu ile o anda içinde bulunduğumuz dizini öğrenebiliriz. Aşağıdaki kodumuzu incelediğiniz zaman ne dediğimi anlayacaksınız.

x = os.getcwd()
print(x)
---
'/root'

Ben linux kullandığım için şuanda “/root” klasörü içinde bulunuyorum. Bu çıktı Windows’ta daha farklı olacaktır.

Chdir() Metodu

Bu fonksiyonumuz ise bizlere farklı bir dizine geçme imkanı verir. Yani ben “/root” dizininden “/root/Documents” dizinine gitmek istiyorum. Bu durumda chdir() fonksiyonunu kullanmam gerekiyor. Aşağıdaki örnekleri inceleyelim.

os.chdir("/root/Documents")

Windows’ta ise bu işlemi şu şekilde yapıyoruz;

os.chdir('C:\\Documents and Settings\\Kullancı_Adı\\Desktop')

Windows’ta kullandığımız dizin ayıracının “\\” olduğuna dikkat edelim. Linux’ta ise dizin ayıracı “/” bu şekildedir. Örneklerimize baktığımız vakit, bulunduğumuz dizini değiştirmek için chdir() fonksiyonuna istediğimiz dizini parametre olarak vermemiz yeterlidir.

Listdir() Metodu

Benim bir hayli faydalı bulduğum listdir() fonksiyonu ile bulunduğumuz dizine ait ne kadar dosya, klasör var ise görüntüleyebiliriz. Bu fonksiyonun düzgün çalışması için parametre olarak bir dizin girmeniz gerekmektedir. Fonksiyonumuz ile ilgili aşağıdaki örneği dikkatle inceleyelim.

dizin = os.getcwd()
os.listdir(dizin)

Bu kodumuzun çıktısı bize içinde bulunduğumuz dizinin içindeki klasör ve dosyaları bir liste şeklinde verecektir. Lafı geçmişken belirtelim, listdir() fonskiyonu dizinin içindeki dosyaları ve klasörleri liste olarak geri döndürür. Bu özelliği kullanarak aşağıdaki gibi bir kod yazalım.

for x in os.listdir(os.getcwd):
print(x)

Bu kodumuz bize listdir() fonksiyonunun döndürdüğü listenin öğelerini tek tek ekrana basar.

Rename() Metodu

Os modülünün rename() adlı fonksiyonu ile dizinlerin adlarını değiştirebiliriz. Hemen bir örnek ile bu modülümüzün işlevini inceleyelim.

os.rename(“deneme”,”deneme_yeni”)

Ben örnek olması açısından ana dizinimde yani içinde bulunduğum dizinde deneme adlı bir klasör oluşturdum. Yukarıdaki kodumuzda deneme adlı klasörümüzün ismini deneme_yeni şeklinde değiştirdik. Bunu kendiniz deniyerekte görebilirsiniz.

Not: Eğer dosyanıza vereceğiniz isim zaten o dizinin içinde varsa Linux’ta isim var olan klasörün üzerine yazılır. Windows’ta ise hata verir.

Remove() Metodu

Adından da anlaşılacağı üzere bilgisayarımızda bulunan dosyaları silme işlemini yapar. Silme işlemini yapmak için sileceğiniz dosyanın ismini parametre olarak vermeniz yeterlidir.

os.remove(“dosya_adı”)
#Eğer farklı bir dizindeki dosyayı silmek istiyorsanız;
os.remove(“/deneme12/silinecek_klasor/silinecek_dosya”)

os modülünün remove() fonksiyonu dizin silmez sadece dosya siler. Dizin silmeye kalkıştığınız zaman şu şekilde bir hata alırsınız.

os.remove("deneme12")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 21] Is a directory: 'deneme12

Mkdir() Metodu

Şimdiki fonksiyonumuz mkdir() bizlere kullandığımız işletim sisteminde yeni dizinler olurşturmamızı sağlar. Örnek verecek olursak;

os.mkdir(“deneme”)

Bu kodumuz bulunduğumuz dizinde deneme adlı bir klasör oluşturacaktır. Tabii başka bir dizinde klasör oluşturmak isteyebilirsiniz onun için ise dizin yolunu parametre olarak girmelisiniz. Hemen bir örnek verelim.

os.mkdir(“/root/Documents/deneme”)

Bu kodumuz root dizini içinde bulunan Documents klasörünün içinde deneme klasörünü oluşturacaktır.

Makedirs() Metodu

Bu fonksiyonumuz mkdir() fonksiyonu gibi çalışır ama aralarında önemli bir fark vardır. Bu fark mkdir() fonksiyonu ile tek bir dizin oluşturabilirken makedirs() fonksiyonu ile bir dizine ait alt ve üst dizinler tek bir kod ile oluşturalabilir. Yani şu demek istiyorum; mkdir(“/root/Documents/deneme”) kodunun içinde bulunan deneme klaösürünün başarı ile oluşturulabilmesi için root ve Documents dizinlerinin önceden sistemimizde var olması gerekmektedir. Halbuki makedirs komutunda eğer root ve Documents dizinleri yoksa onlarda oluşturulur. Bir örnek bu anlattıklarımızı iyice bir kavrayalım.

os.mkdir(“/root/deneme1/deneme2/deneme3/son_klasor”)
#eğer sistemimizde deneme1, deneme2, deneme3 dizinleri mevcut değilse şu şekilde bir hata verecektir
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: 'deneme1/deneme2/deneme3/son_klasor'

Aşağıdaki kodumuz ise hata vermeyecektir. Çünkü deneme1, deneme2 ve deneme3 dizinleri otomatik olarak sistemimizde oluşturulacaktır.

os.makedirs(“/root/deneme1/deneme2/deneme3/son_klasor”)

Rmdir() Metodu

Hatırlarsanız remove() adlı fonksiyon ile sadece dosya silebiliyorduk. Dizin silme işlemini yapamıyorduk. Bu sorunu rmdir() fonksiyonu ile aşabiliriz. Yani rmdir() fonksiyonu bizlere içi boş bir dizini silme imkanı tanıyor. Eğer sileceğimiz dizinin içi dolu ise bu fonksiyomuz hata verecektir. Örnek olarak bir önceki oluşturduğumuz deneme1 ile başlayan iç içe dizinleri kullanalım.

os.rmdir("deneme1")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 39] Directory not empty: 'deneme1'

Doğal olarak silmedi çünkü içi dolu. Şimdi ise şu kodumuza bir bakalım.

os.rmdir("deneme1/deneme2/deneme3/son_klasor")

Gördüğünüz gibi bu kodumuz herhangi bir hata vermedi çünkü silinecek olan son_klasor adlı dizinin içi boş.

Removedirs() Metodu

Python’da os modülü ile ilgili şimdi göreceğimiz removedirs() adlı fonksiyonumuz bizlere içi boş olmak kaydı ile tüm dizin yollarını silme imkanı veriyor. Mesela bir önceki örneğimiz olan deneme1, deneme2 ve deneme3 adlı iç içe dizinlerimizi bu fonksiyon yardımı ile silebiliriz.

os.removedirs(“deneme1/deneme2/deneme3”)

Bu kodumuz bu dizinleri bilgisayarımızdan hata vermeyecek şekilde silecektir.

Walk() Metodu

Bana göre walk() fonksiyonu os modülüne ait en sağlam ve kullanışlı fonksiyonlardan biridir. Çalışma prensibi olarak listdir() fonksiyonuna benzer. Hatırlarsanız listdir() fonksiyonu ile bir dizinin içinde ne var ne yok görebiliyorduk ama baktığımız dizinin içinde bir başka dizin var ise o dizinin içine girip bakmak için yeniden listdir() fonksiyonunu kullanmamız gerekiyordu. Bu durum bu şekilde devam ediyordu. Peki bir dizinin içinde bulunan içi içe birçok dizini tek bir fonksiyon yardımı ile açıp listelemek istersek ne yapacağız ? Atıyorum bir dizinin içinde 100 adet farklı dizin var 100 tane listdir() fonksiyonumu yazacağız… Bunun gerçekten çok zor ve gereksiz olduğunu anlamışsınızdır. İşte tam burada imdadımıza walk() fonksiyonu yetişiyor. Bu fonksiyon ile bir dizinin içinde bulunan tüm dizinleri tek bir kod yardımı ile listeleyebilirsiniz. Os modülüne ait walk() fonksiyonu bizlere 3 öğeli bir demet döndüdürür. İsterseniz daha fazla teorik bilgiye boğulmadan örneklere geçelim.

for i in os.walk("gireceginiz_dizin"):
print(i)
#Çıktı olarak
('gireceginiz_dizin', ['kitaplar'], ['dosya.doc', 'dosya.jpeg',
'dosya.txt', 'dosya.xls'])
('gireceginiz_dizin/kitaplar, ['başkadosyalar'], ['kitap1.pdf',
'kitap2.pdf', 'kitap3.pdf', 'kitap4.pdf'])
('gireceginiz_dizin/kitaplar/başkadosyalar', [], ['dosya.jpeg',
'dosya.mp3', 'dosya.ogg', 'dosya.pdf', 'dosya.zip'])

Çıktığımızı inceledeğiniz vakit 3 öğeli demetimizin ilk öğesi içinde bulunulan dizinin adresini verir, ikinci öğe ise eğer içinde bulunulan dizinin içinde başka dizinler var ise onları liste şeklinde tutar. Üçüncü ve son öğe olan kısım ise dizinin içinde bulunan dosyaları liste şeklinde tutar. Temel prensip bu şekildedir, walk() fonksiyonu otomatik olarak belirtilen dizinin içindeki tüm dizinleri bu 3 öğeli demet prensibini gözeterek bizlere verir. Konunun sonundaki bonus bölümünde walk() fonksiyonunu kullanarak bir uygulama geliştireceğiz. Bonus bölümünündeki uygulamamızı da inceleyerek konuyu çok daha iyi anlayabilirsiniz.

Environ() Metodu

Os modülü ile ilgili konumuza dur durak demeden devam ediyoruz. Şimdiki fonksiyonumuz bizlere bilgisayarımızdaki çevre değişkenleri ile ilgili bilgi sağlar. Bu fonksiyonumuz çevre değişkenlerine ait değerleri bir sözlük şeklinde tuttuğunu da ek olarak belirtelim. Konu ile ilgili olaraktan örnek kodumuzu inceleyelim.

for i,j in os.environ.items():
print(i, " ", j)

Bu kodumuz bizlere uzunuca bir çıktı verecektir. Çıktıyı kendi bilgisayarınızda inceleyerek fonksiyonun tam olarak ne işe yaradığını da kolaylıkla anlayabilirsiniz. Tabii bu çıktılar kullandığınız işletim sistemine göre farklılık gösterebilir. Bu bilgiyi de göz ardı etmemekte fayda var diyerek bir diğer fonksiyonumuza geçelim.

Path Niteliği

Python’da os modülü ile ilgili olaraktan son işleceğimiz başlık path niteliği. Evet bu bir fonksiyon değil, ama fonksiyon olmaması içinde fonksiyon olmadığı anlamına gelmez. İçinde kendine ait birçok fonksiyonu ve niteliği barındırır. Şimdi alt başlıklar ile path niteliğinin özelliklerini inceleyelim.

abspath()

Path niteliğine ait olan abspath() fonksiyonu bize bir dosyanın bulunduğu dizinin tam adresini verir. Örnek verecek olursak.

x = os.path.abspath("deneme.jpeg")
print(x)

Bu kodumuz bizlere deneme.jpeg dosyasının tam adresini verir.

exists()

Bu fonksiyon bizlere bir dosyanın veya bir dizinin var olup olmadığı ile ilgili bilgi verir. Mesela girceğimiz bir dizin yolu veya dosya yoksa False var ise True çıktısı verir.

os.path.exists("/etc")
---
True

Benim bilgisayarım da /etc dizini bulunduğu için True çıktısı verdi.

isdir()

Path niteliğine ait olan isdir() fonksiyonu ise bizlere parametre olarak girilen bir dosya yolunun, dizin olup olmadığını verir.

os.path.isdir("/etc")
---
True

Os modülü ile ilgili olaraktan en son baktığımız path niteliği bünyesinde isfile(), join(), split() gibi birçok fonksiyon barındırır. Bunlarla ilgili detaylı bilgi edinmek için şu adresi ziyaret edebilirsiniz. Python’daki diğer modüller ile kıyaslandığında os modülü gerçekten çok daha kapsamlı olarak incelenebilir. Zaten bu yazıda da elimden geldiği kadar detaya girmeye çalıştım. Çünkü bir programcı olarak os modülü gibi bir modül sizler için bir hayat kurtarıcı olabilir.

Bonus: Walk fonksiyonu ile Detaylı Sıralama Yapmak

Hatırlarsanız walk() fonksiyonu bizlere parametre olarak verilen bir dizinin tüm içeriğini 3 öğeli bir demet olarak geri döndürüyordu. Şimdi bu özelliği ve for döngüsünü kullanarak bir dizinin içinde bulunan belirli bir uzantıya sahip tüm dosyaları ekrana basan bir program yazalım.

for anadizin, diger_dizin, dosyalar in os.walk("/root/Pictures"):
print(anadizin)
for dosya in dosyalar:
if dosya.endswith(".png"):
print(dosya)

Bu kodumuzun amacı /root/Pictures dizini içinde bulunan dosyalardan sonu .png ile biten tüm öğeleri ekrana basmasıdır. Eğer dizinimizin içinde başka bir dizin varsa öncelikle anadizinde arama işlemini yapar, ana dizinde arama işlemi bitinde döngü başa gelir ve diger dizinin içine girer. Artık anadizinimiz program için diger_dizin olmuştur ve o dizinin içinde sonu .png ile biten dosyaları arar. Bu durum girdiği dizin içinde artık dizin kalmayana kadar devam eder. Ne zaman diger_dizin “[]” yani boş olursa program sonlanır. Programı sizde yazarak verdiği çıktıyı inceleyeniz. Bir sonraki yazıda görüşmek üzere.

Yazar Hakkında

Hakan İlbiz

Siber güvenlik, linux, programlama ve network gibi bilgisayar bilimlerini kapsayan alanlarda yaptığı çalışmalardan edindiği tecrübeleri, kurucusu olduğu kodputer.com adlı web sitesinde okurlarına sunan ve bundan büyük bir haz duyan Sakarya Üniversitesi Bilgisayar Mühendisliği öğrencisi.

Yorum Ekle

Yorum Yazmak İçin Tıkla