27 Temmuz 2013 Cumartesi

OS Modülü

Python bir çok modülden oluşur. Bir programcı ihtiyaç duyacağı hemen her temel fonksiyonu hazır modüller içerisinde bulabilir. os modülü işletim sistemi tarafından sağlanan bir çok hizmeti Python içerisinde kolay bir şekilde kullanmamızı sağlayacak nesneleri barındırır. Daha önce de söylediğimiz gibi .py uzantılı her dosya bir modüldür. Buradan anlıyoruz ki os modülü os.py programından başka bir şey değildir. Bizim yazdığımız modüllerden içeriği dışından hiç bir fark yoktur. GNU/Linux sistemlerinde bu modülü /usr/lib/python2.7/ dizininde Winodws sistemlerinde ise C:/Python26/Lib dizininde bulabilirsiniz.
Bu modülü kendi yazdığımız modüller gibi içe aktarıyoruz.
import os
Bu tarz Python ile beraber gelen modüllerin bizim yazdığımız modüllerden en önemli farkı, yazdığımız program nerede olursa olsun bu modülleri bu şekilde içe aktarabiliyoruz. Kendi yazdığımız modüllerde modül ve program yan yana olmalıydı. Bu modüller için ise bu gerekli değildir.
Şimdi gelin daha önce bahsettiğimiz dir() fonksiyonu ile os modülü içerisindeki fonksiyonları ve nitelikleri öğrenelim.
import os
for i in dir(os):
    print i
Bu kod parçasını çalıştırırsanız göreceksiniz ki os modülü içerisinde oldukça fazla fonksiyon ve işlev bulunmaktadır. Fazla olduğundan dolayı buraya yazmıyoruz. Şimdi en çok kullanılanlarını inceleyeceğiz.
os.name
Bu nitelik, kullandığımız işletim sistemi hakkında bilgi verir.
print os.name
posix
Biz GNU/Linux işletim sistemi üzerinde çalıştırdığımız için çıktı olarak posix verdi. İşletim sistemlerine göre çıktı şu şekilde olacaktır.
  • GNU/Linux için:“posix”
  • Windows için:“nt”, “dos”, “ce”
  • Macintosh için: “mac”
  • OS/2 için:“os2”
  • Risc Os için:“riscos”
os modülünün name niteliğini kullanarak işletim sistemlerine göre programlar yazabiliriz. Bu şekilde yazdığımız programın birden fazla işletim sistemi üzerinde çalışmasını sağlamış olur ve eğer işletim sistemi komutlarını kullanacaksak hataların önüne geçmiş oluruz.
Basit bir örnek yapalım;
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import os
if os.name=="posix":
    print "Özgür yazılıma destek verdiğiniz için teşekkür ederiz."
elif os.name=="nt":
    print "Bir an önce Özgür yazılıma geçiş yapmalısınız."
Özgür yazılıma destek verdiğiniz için teşekkür ederiz.
Not: Eğer kullandığınız işletim sistemi GNU/Linux tipinde ise os.uname ile çekirdeğe ait daha ayrıntılı bilgi elde edebilirsiniz.
print os.uname()
('Linux', 'mazlumagar-Ideapad-Z570', '3.2.0-41-generic-pae', '#66-Ubuntu SMP Thu Apr 25 03:50:20 UTC 2013', 'i686')
os.system()
Bu fonksiyon işletim sistemi ait sistem komutlarını çalıştırmamızı sağlar.
Sistem komutu: Üzerinde çalıştığımız işletim sitemine ilişkin işlemleri yerine getirmemizi sağlayan komutlardır. Örneğin; mkdir komutu Linux işletim sisteminde klasör oluşturmamızı sağlar.
import os
if os.system("mkdir 'Yeni Klasör'"):
    print "Klasör başarılı bir şekilde oluşturuldu."
else:
    print "Klasör oluşturulamadı."
Klasör başarılı bir şekilde oluşturuldu.
Gördüğünüz gibi os.system() fonksiyonun kullanımı oldukça basit. Burada "Yeni Klasör" adında bir dizin oluşturduk. Yapmamız gereken sadece system("sistem komutu") şeklinde kullanmaktır.
import os
if os.name=="posix":
    if os.system("mkdir 'Yeni Klasör'"):
        print "Klasör başarılı bir şekilde oluşturuldu."
    else:
        print "Klasör oluşturulamadı."
elif os.name=="nt":
    if os.system("md Yeni Klasör"):
        print "Klasör başarılı bir şekilde oluşturuldu."
    else:
        print "Klasör oluşturulamadı."
Klasör başarılı bir şekilde oluşturuldu.
Örneği biraz daha değiştirdik. Bir önceki başlıkta işlediğimiz os.name komutunu da kullanarak işletim sistemine göre işleyen bir program yazdık. Windows işletim sisteminde yeni klasör oluşturmaya yarayan sistem komutu md'dir.
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import os
os.system("xdg-open yazi.txt")
xdg-open komutu GNU/Linux işletim sistemlerinde çalışan bir komuttur. Bu komut istenilen dosya veya klasörü varsayılan uygulama ile açmamızı sağlar. Bu işlemi şu şekilde de yapabilirdik.
os.system("kwrite yazi.txt")
Burada varsayılan uygulama ile aç değilde "kwrite" uygulaması ile aç dedik. Bu tarz kullanım eğer sistem de "kwrite" yok ise hata verecektir. Bu yüzden xdg-open komutu bizim çok işimize yarayan bir komuttur. Windows'ta bu komuta benzer işlemi os.startfile("dosyaadi") ile yapabilirsiniz.
os.listdir()
os.listdir() fonksiyonu bir klasördeki klasör ve dosyaların listesini almamızı sağlar.
import os
print os.listdir(".")
['faktoriyel.py', 'listdir.py', 'os.uname.py', 'ilkmodul.py', 'yazi.txt~', 'faktoriyel.pyc', 'syste2.py', 'yazi.txt', 'environ.py', 'ilkmodul.pyc', 'system.py', 'modulcagir.py', 'Yeni Klas\xc3\xb6r', 'deneme.py']
Gördüğünüz gibi bize içinde bulunduğumuz dizinin içinde bulunan dosya ve klasör isimlerini bir liste şeklinde döndürdü. Burada kullandığımız "." içinde bulunduğumuz dizini temsil eder. Eğer bir üst dizine çıkmak istersek ".." kullanabiliriz. Burada tabi şu şekilde bir yolda belirtebiliriz; os.listdir("/usr/bin").
import os
for i,k in enumerate(os.listdir(".")):
    print i+1,k
1 faktoriyel.py
2 listdir.py
3 path.py
4 os.uname.py
5 ilkmodul.py
6 yazi.txt~
7 faktoriyel.pyc
Bu şekilde yazdığımız programı daha düzenli hale getirdik.
os.path()
Python'da klasörlere ilişkin fonksiyonları os modülünün path nesnesinde bulabilirsiniz. Bir patikanın(dosya veya klasör) var olup olmadığını os.path.exists() fonksiyonu ile kontrol edebiliriz.
os.path.exists('dosya veya klasör adı')
True
Eğer dosya veya klasör var ise "True" değer döner. os.path.exists() sadece dosya veya klasörün var olup olmadığı ile ilgilenir. Yani dosya mı klasör mü ? Bununla ilgilenmez.
import os 
dosya_adi = raw_input('Okuyacağınız dosya adını girin:')

if not dosya_adi:
    print "Dosya adı girmediniz.."
else:
    if os.path.exists(dosya_adi):
        print open(dosya_adi).read()
    else:
        print 'Böyle bir dosya yok'
Okuyacağınız dosya adını girin:yazi.txt
www.pythondersleri.com => Python için Türkçe doküman sağlar.
Bu programda kullanıcıdan bir dosya adı aldık ve var ise dosyayı okuduk. Ama burada girilen isim eğer bir dizin adı olursa program okumaya çalışır ve hata ile karşılaşırız. Eğer bir patikanın dosya mı yoksa klasör mü olduğunu kontrol etmek istiyorsak os.path.isfile() ve os.path.isdir() fonksiyonlarını kullanabiliriz. os.path.isfile() fonksiyonu dosya olup olmadığını kontrol eder. Şimdi önceki örneğimizi şu şekilde değiştirelim.
import os 
dosya_adi = raw_input('Okuyacağınız dosya adını girin:')

if not dosya_adi:
    print "Dosya adı girmediniz.."
else:
    if os.path.isfile(dosya_adi):
            print open(dosya_adi).read()
    else:
        print 'Böyle bir dosya yok'
Okuyacağınız dosya adını girin:Yeni Klasör
Böyle bir dosya yok
Gördüğünüz gibi artık kullanıcı var olan bir klasör bile girse program hata ile karşılaşmayacak.
İşlev Görev Örnek
os.path.basename() Verilen patikanın en son bileşenini verir. os.path.basename('/usr/bin/python')
python
os.path.dirname() Bir dosyanın bulunduğu klasörü verir. os.path.dirname('/usr/bin/python')
/usr/bin
os.path.splitext() Bir dosyayı uzantısına göre ayırır. os.path.splitext('/usr/lib/python2.7/os.py')
('/usr/lib/python2.7/os', '.py')
os.path.join() Verilen argümanları bir patikaya dönüştürür. os.path.join('usr','lib','python2.7','os.py')
usr/lib/python2.7/os.py
os.path.abspath() Verilen patikanın tam yerini verir. os.path.abspath('/usr/lib/python2.7')
/usr/lib/python2.7
Şimdi os.listdir() başlığında verdiğimiz örneği şu şekilde değiştirelim.
import os
klasor = "." 
for i in os.listdir(klasor):
    dosya = os.path.join(klasor,i)
    if os.path.isdir(dosya):
        print 'Klasör => ',i
    elif os.path.isfile(dosya):
        print 'Dosya => ',i
Dosya =>  faktoriyel.py
Dosya =>  listdir.py
Dosya =>  environ.py
Klasör =>  Deneme
Dosya =>  modulcagir.py
Klasör =>  Yeni Klasör
os.walk()
Program içerisinde bir klasörün tüm alt klasörleri ile birlikte taranmasını sağlar. walk() iterasyon edilebilir bir nesnedir. İterasyon sonucunda 3 elemandan oluşan bir demet döner. İlk eleman bulunulan klasörü, ikinci eleman bu klasörde bulunan klasörlerin listesi, üçüncü eleman ise bu klasörde bulunan dosyaların bir listesidir.
import os

for i in os.walk("/home/mazlumagar/Filmler"):
    print i
('/home/mazlumagar/Filmler', ['Macera', 'Dram', 'Aksiyon', 'Romantik'], [])
('/home/mazlumagar/Filmler/Macera', [], [])
('/home/mazlumagar/Filmler/Dram', ['Khan'], ['Benioku.txt'])
('/home/mazlumagar/Filmler/Dram/Khan', [], [])
('/home/mazlumagar/Filmler/Aksiyon', ['Bruce'], ['BeniOku.txt'])
('/home/mazlumagar/Filmler/Aksiyon/Bruce', [], [])
('/home/mazlumagar/Filmler/Romantik', [], [])
Filmler klasörünün içeriğini listelemiş olduk. Filmler klasöründe dört adet klasör var ve dosya yok. Dram klasöründe "Khan" adında başka bir klasör ve "Benioku.txt" adında dosya mevcut. walk() fonksiyonu bu şekilde bizim işimizi çok kolaylaştırarak klasörleri taramamızı sağlıyor.
os.access()
Sadece Unix tipi işletim sistemlerinde os.access() ile erişim denetimini kontrol edebiliriz. os.access() işlevine vereceğiniz ilk argüman patika ikinci argüman ise erişim kipidir.
Erişim Kipleri
  • os.F_OK:Patikanın var oluş kipi
  • os.R_OK:Okuma kipi
  • os.W_OK:Yazma kipi
  • os.X_OK:Tarama kipi
print os.access("/home/mazlumagar/workspace", os.R_OK)
True # workspace klasörünün okuma izni bulunmaktadır
print os.access("/usr", os.W_OK)
False # usr klasörünün yazma izni bulunmamaktadır.
Bu şekilde klasörlerin erişim izinlerini kontrol edebiliriz.
os.getcwd()
os.getcwd() fonksiyonu bize o an hangi klasör içinde çalıştığımızı döndürür.
import os 
print os.getcwd()

/home/mazlumagar/workspace/Python/mdül # Şuanda çalıştığımız dizinin yolu
os.chdir()
Bu fonksiyon sayesinde içinde bulunduğumuz dizini değiştirebiliriz. Hemen bir örnek verelim.
#-*- coding:utf-8 -*-
import os 

print "Dizin değiştirmeden önce=>",os.getcwd()
os.chdir('/var')
print "Dizin değiştirdikten sonra=>",os.getcwd()
Not:Daha önceki verdiğimiz örneklerde kullanmıştık. "." işareti içinde bulunduğumuz dizini temsil ediyordu. Python'da os.curdir de aynı işlevi görür. ".." işareti gibi os.pardir de bir üst dizini temsil eder. os.mkdir() ve os.makedirs()
os.mkdir() fonksiyonu klasör oluşturmamızı sağlar.
import os
os.mkdir("deneme")
Biz bu işlemi os.system("mkdir","yol") yönetimi ile de yapmıştık.
Peki iç içe birden fazla klasör oluşturmak istersek ne olacak? Bir deneyelim.
os.mkdir("deneme/test")
Traceback (most recent call last):
    os.mkdir("deneme/test")
OSError: [Errno 2] No such file or directory: 'deneme/test'
Burada içerisinde "test" adında bir klasör barındıran "deneme" klasörünü oluşturmaya çalıştık. Python bize hata döndürdü. Eğer bu şekilde iç içe klasörler oluşturmak istersek, os.mkdir() fonksiyonu bize yardımcı olamaz. Bunun için os.makedirs() fonksiyonunu kullanmalıyız.
import os
os.makedirs("deneme/test")
Bu şekilde herhangi bir hata almadan, klasörleri oluşturduk.
os.rmdir() ve os.removedirs()
Bu fonksiyonlar içi boş mevcut dizinleri silmemizi sağlar. Hemen bir örnek verelim. Çalışma dizinimiz içerisinde bulunan "test" isimli klasörü silelim.
import os

os.rmdir("test")
Başarılı bir şekilde silme işlemini gerçekleştirdik. Şimdi az önce oluşturduğumuz "deneme" klasörünü silmeye çalışalım.
os.rmdir("deneme")
Traceback (most recent call last):
    os.rmdir("deneme")
OSError: [Errno 39] Directory not empty: 'deneme'
Oluşturduğumuz "deneme" klasörü içerisinde "test" adında bir klasör bulundurduğu için Python bize hata döndürdü. Az önce de söylediğimiz gibi bu yöntemler boş klasörleri silmemizi sağlar. Klasör oluştururken geçerli kural burada da geçerlidir. Eğer iç içe birden fazla boş dizini silmek istersek os.removedirs() fonksiyonunu kullanmalıyız.
os.removedirs("deneme/test")
"deneme" ve içerisindeki "test" klasörlerini silmiş olduk.
sep Niteliği
Bu nitelik bize işletim sistemlerinin dizin ayraçları hakkında bilgi verir.
import os
print os.sep
/
Bu programı Linux'da çalıştırdığımız için bize "/" döndürdü. Yani Linux'da dizin ayracı olarak "/" kullanılıyor. Eğer bu programı Windows'da çalıştırırsanız şu çıktıyı alırsınız.
\\
Peki bu ne işimize yarar? Yazdığımız programın işletim sistemleri ayırt etmeden sorunsuz bir şekilde çalışmasını sağlar. Yani az önce klasör silerken dizin ayracını kendimiz yazdık. Ama aynı programı Windows'da çalıştırmak istersek sorun çıkartabilir. Bu yüzden şu şekilde kullanabiliriz.
os.rmdir("deneme"+os.sep+"test")
Bu şekilde "deneme" içersindeki "test" klasörünü silmiş olduk. Yada klasör oluştururken de aynı işlemi yapabiliriz.
import os

os.makedirs("deneme"+os.sep+"test")
Bu şekilde yazdığımız programın klasör oluşturması gerekebilir. Eğer biz direk kullandığımız işletim sisteminin dizin ayracını kullanırsak. Başka bir işletim sisteminde kullanan kullanıcı sorun ile karşılaşabilir. Bu yüzden doğrudan dizin ayracını kullanmak yerine os modülünün sep niteliğini kullanmak daha sağlıklı olacaktır.

5 yorum :

  1. import os

    dosya1 = os.path.join('Local Disk(C:)','Users','i')
    i = raw_input("yaz")
    print dosya1

    bunun çıktısı;

    yazasd
    Local Disk(C:)\Users\i # bu olyor yani i yerine kullanıcıdan aldıgım degeri girmiyor sebebi nedir yardımcı olursanız sevinirim

    YanıtlaSil
  2. i = raw_input("yaz") ifadesi ile dosya1 = os.path.join('Local Disk(C:)','Users','i') ifadelerinin yerlerini değiştirerek denerseniz problem muhtemelen düzelecektir.

    YanıtlaSil
  3. sorunun cevabını buldum ;
    dosya = raw_input("yaz")
    patika = os.path.join('c','users')
    patika1 = os.path.join(dosya)
    patika2 = os.path.join(patika,patika1)
    print patika2

    şeklinde düzenliyerek çözdüm sorunu paylaşırsanız sorun yasayan arkadaslara örnek olur.

    YanıtlaSil
    Yanıtlar
    1. "Adsız" Arkadaşım amma uzatmışsın os.path.join() çözümünü gereği var tek satırda yaz gitsin => print os.path.join('C:\\','Users',raw_input("Son bileşeni girin: "))

      Çıktısı = >
      Son bileşeni girin: alican
      C:\Users\alican

      Sil
  4. python ile ornegin /dev/sdb diskini bolumleme yapabilirmiyim yapabilirsem nasil yardim edebilirmisiniz en azindan bir kaynak

    YanıtlaSil