AÖF Soru Bankası

Programlama IIÜnite 5 Soru-Cevap

Programlama II (BIL203U) soru-cevapları.

Python'da dosya açmak için kullanılan fonksiyon nedir ve nasıl kullanılır? Örnekle açıklayınız.

Python, bir dosyayı açmak için dahili bir open() fonksiyonuna sahiptir. Bu fonksiyon, dosyayı uygun şekilde okumak veya değiştirebilmek için tanımlayıcı olarak da adlandırılan bir dosya nesnesi döndürmektedir.

Kod:

# dosyayı geçerli dizinde oluşturur

dosya = open("ilk_dosyam.txt")

# dosyayı özel olarak verilmiş dizinde oluşturur

dosya = open("D:/dosya_arsivi/python_notları.txt")

Python'da dosya erişim modları nelerdir? Açıklayınız.

Python programlama dilinde, bir dosya açarken mod belirtilebilir. Modda, dosyaya “r” okuma, “w” yazma veya “a” ekleme durumlarından biri belirtilebilir. Ayrıca dosyanın metin modunda veya ikili (binary) modda açılması da parametrik olarak belirtilebilir. Dosyanın varsayılan okuma modu ise metin modudur. Bu modda, dosyadan okurken dizeler (string) alınmaktadır. Bunun yanında, ikili mod bayt değer döndürmektedir. Bu mod, resim veya yürütülebilir dosyalar (exe uzantılı) gibi metin olmayan dosyalarla uğraşırken kullanılacak moddur.

Python'da dosya kapatma işlemi nasıl gerçekleştirilir? Örnekle açıklayınız.

Dosya üzerinde yapılan işlemler bittiğinde dosyanın düzgün bir şekilde kapatılması gerekmektedir. Bir dosya kapatılarak, dosyaya bağlı olan kaynaklar serbest bırakılmaktadır. Dosya kapatma işlemi close() yöntemi kullanılarak yapılmaktadır. Python’da, artık başvurulmayan nesneleri temizlemek için bir çöp toplayıcısı (Garbage Collector) yapısı bulunmaktadır, fakat dosya kapatma işlemleri için bu yapıya güvenilmemelidir.

Kod:

qdosya = open("metin_dosyası.txt", encoding = 'utf-8')

# Dosya işlemlerinin yapıldığı kod bloğu

dosya.close()

Bu yöntem de tamamen güvenli değildir. Dosya ile işlem yaparken bir hata oluştuğunda, kod dosyayı kapatmadan çıkacaktır. Bu yüzden daha güvenli bir yol olan, hata yakalama amacıyla kullanılan try... finally bloğu kullanılmalıdır.

try:

dosya = open("metin_dosyası.txt", encoding = 'utf-8')

# Dosya işlemlerinin yapıldığı kod bloğu

finally:

      dosya.close()

Bu şekilde, program akışının durmasına neden olan bir hata ortaya çıktığı durumda bile dosyanın düzgün bir şekilde kapatılması sağlanacaktır. Bir dosyayı kapatmanın en iyi yolu “with” deyiminin kullanılmasıdır. “with” deyimi sayesinde, with ifadesinin içindeki bloktan çıkıldığında dosyanın kapatılması sağlanmaktadır. Ayrıca close() fonksiyonu dahili olarak çağrıldığı için tekrar çağrılmasına gerek duyulmaz.

Kod:

with open("metin_dosyası.txt", encoding = 'utf-8') as dosya:

# Dosya işlemlerinin yapıldığı kod bloğu

Python'da bir dosyaya veri yazmak için kullanılan modları açıklayınız.

Python’da bir dosyaya veri yazmak için onu “w” yazma, “a” ekleme veya “x” özel oluşturma modunda açılması gerekmektedir. Dosya mevcutsa, var olan dosyadaki tüm verileri silerek üzerine yazacağı için “w” modunun kullanımına dikkat edilmesi gerekmektedir. Bir metin dizisi veya bayt dizisi yazmak için (ikili dosyalarda) write() metodu kullanılmaktadır. Bu metot, dosyaya yazılan karakter sayısını döndürmektedir.

Dosya okumada read() yöntemi hangi amaçla kullanılır? 

Dosya okuma kodunda, read() yönteminin verilen sayı kadar karakter döndürdüğü görülmektedir. Dosyanın sonuna ulaşıldığında, daha fazla okuma yapılamadığı için boş veri dönmektedir.

Python dosya metotlarından detach(), read(x) ve write(m) fonksiyonlarını tanımlayınız.

detach(): Temel alınan akışı (stream) arabellekten ayırarak döndürür.

read(x):Dosyadan en fazla x adet karakter okur. Negatif, None (Yok) veya boş ise dosyanın sonuna kadar okur.

write(m): Dosyaya parametre olarak verilen m dizesini yazar ve yazılan karakter sayısını döndürür.

readlines() fonksiyonunu açıklayınız.

readlines() fonksiyonu dosyanın tüm kalan satırlarının bir listesini döndürmek için kullanılır. Tüm bu okuma yöntemleri, dosyanın sonuna (EOF) ulaşıldığında boş değer döndürmektedir.

Mevcut çalışma dizini (CWD) değiştirmek için hangi yöntem kullanılır? Örnekle açıklayınız.

Mevcut çalışma dizini (CWD) değiştirmek için os.chdir() yöntemi kullanılmaktadır. Bu yöntem, CWD’yi belirtilen bir dosya yolu ile değiştirir. Yeni bir dizin yolu olarak yalnızca tek bir argüman alır. Yeni dizin yolu elemanlarını ayırmak için hem ters bölü “\” hem de “/” bölü işareti kullanılabilir.

Kod:

import os

print(os.getcwd())

os.chdir('D:\\temp')

print(os.getcwd())

Kod Çıktısı:

D:\Project Python\uniteler

D:\temp

Python'da geçerli dizini alma nasıl sağlanır?

Geçerli Çalışma Dizini (CWD), Python kodunun çalıştığı bir klasör olarak düşünülebilir. Dosyalar yalnızca adlarıyla çağrıldığında, Python yorumlayıcısı bunun CWD’de başladığını varsayarak işlem yapar. Programın mevcut çalışma dizini (Current Working Directory - CWD), os modülünün getcwd() yöntemi kullanılarak elde edilebilir. Bu yöntem, geçerli çalışma dizinini bir dize biçiminde döndürmektedir.

Kod:

# işletim sistemi modülünü içe aktarma

import os

# Geçerli çalışma dizinini al

cwd = os.getcwd()

# Geçerli çalışma dizinini yazdır

print("Geçerli çalışma dizini:", cwd)

Kod Çıktısı:

Geçerli çalışma dizini: D:\Project Python\uniteler

Bir dizindeki tüm dosya ve alt dizinleri listelemek için hangi fonksiyon kullanılır? Örnekle açıklayınız.

Bir dizindeki tüm dosya ve alt dizinlere listdir() fonksiyonu kullanılarak elde edilebilir. Bu fonksiyon parametre olarak bir dosya yolu alır ve bu dosya yolundaki alt dizinlerin ve dosyaların bir listesini döndürür. Yol belirtilmezse, geçerli çalışma dizinindeki alt dizinlerin ve dosyaların listesini döndürür.

Kod:

import os print(os.getcwd())

print(os.listdir())

print(os.listdir('c:\\program files\\7-zip'))

Kod Çıktısı:

D:\Project Python\uniteler

['config.py', 'main.py', 'matematik.py', 'metin_dosyası.txt', 'sabit_degerler. py', 'unite01.py', 'unite02.py', 'unite03.py', 'unite04.py', 'unite05.py'] ['7-zip.chm', '7-zip.dll', '7-zip32.dll', '7z.dll', '7z.exe', '7z.sfx', '7zCon. sfx', '7zFM.exe', '7zG.exe', 'descript.ion', 'History.txt', 'Lang', 'License. txt', 'readme.txt', 'Uninstall.exe']

Yeni bir dizin oluşturmak için hangi fonksiyon kullanılır?

Yeni bir dizin oluşturmak için os modülünün desteklediği os.mkdir() fonksiyonu bulunmaktadır. Bu fonksiyona parametre olarak verilen, “dosya yolu” isimli bir dizin oluşturmak için kullanılır. Oluşturulacak dizin zaten mevcut ise, bu yöntem FileExistsError hatası verecektir.

Kod:

import os

os.mkdir('bir alt dizin')

print(os.listdir()) 

Kod Çıktısı:

['bir alt dizin', 'config.py', 'main.py', 'matematik.py', 'metin_dosyası.txt', 'sabit_degerler.py', 'unite01.py', 'unite02.py', 'unite03.py', 'unite04.py', 'unite05.py']

Bir dizini veya dosyayı yeniden adlandırmak için hangi fonksiyon kullanılır?

Bir dizini veya dosyayı yeniden adlandırmak için rename() fonksiyonu kullanılmaktadır. Bu fonksiyon iki temel parametre almaktadır. Bunlardan ilki eski isim, ikinci parametre de yeni isim değerleridir.

Kod:

import os

os.chdir('D:\\temp')

os.mkdir('eski dizin')

print( os.listdir() )

os.rename('eski dizin', 'güncel dizin')

print( os.listdir() )

Kod Çıktısı:

['eski dizin'] 

['güncel dizin']

Aşağıdaki dolu bir dizinin silinmesi kod örneğinin sonucu ne olacaktır? Açıklayınız.

import os

os.chdir('D:\\temp')

print( os.listdir() )

os.mkdir('yeni_dizin')

os.chdir('D:\\temp\\yeni_dizin')

dosya = open("metin_dosyası.txt", mode='x', encoding='utf-8')

dosya.close()

print(os.listdir())

os.chdir('D:\\temp')

os.rmdir('yeni_dizin')

print(os.listdir())

Kod Çıktısı:

[ ]

['metin_dosyası.txt']

Traceback (most recent call last):

File "D:\Project Python\unite05.py", line 13, in os.rmdir('yeni_dizin')

OSError: [WinError 145] Dizin boş değil: 'yeni_dizin'

Kod örneğimizde yeni bir dizin oluşturduktan sonra bu dizin içine bir dosya oluşturuldu. Daha sonra bir üst dizine geçerek içinde dosya olan dizinin silme denendi. Fakat dizin dolu oldıuğu için bu silme işlemi hata ile sonuçlandı. Bu gibi durumlarda boş olmayan bir dizini kaldırmak için “shutil” modülü içindeki rmtree() metodu kullanılabilir.

Program yazarken programcıların ve son kullanıcıların karşılaştıkları hatalar ne şekilde gruplandırılır? Açıklayınız.

Program yazarken programcıların ve son kullanıcıların karşılaştıkları hatalar vardır. Genel olarak 3 farklı şekilde hataları gruplayabiliriz.

1. Program Hataları (Syntax errors): Programlama dilinin söz dizimine uygun olmayan kod yazılması nedeniyle ortaya çıkan hataya yazım (syntax) veya çözümleme (parsing) hatası denilmektedir.

2. Mantık Hataları (Bug): Mantık hatalarının fark edilmesi, yazım hatalarına göre daha zordur. Program çalışırken işleyişe müdahale edecek, sonlanmasına neden olacak bir hata oluşmaz. Fakat, istenilenden daha farklı sonuç veriyor olması ile bu mantık hataları ortaya çıkmaktadır. 

3. İstisnalar (Exceptions): Söz diziminden başarılı bir şekilde geçtikten sonra oluşan hatalara istisna denilmektedir. Sayının sıfıra bölünmesi, olmayan bir dosyaya erişim veya içe aktarılmaya çalışılan bir modülün bulunmaması gibi hatalar bunlara örnek verilebilir. Bu şekilde bir çalışma zamanı hatası meydana geldiğinde, Python programlama dili bir istisna nesnesi oluşturmaktadır. Eğer olası hatalar düzgün bir şekilde ele alınarak kullanıcıyı uyarmazsa, yorumlayıcı hatanın neden olduğu hakkında bir geri bildirimi ekrana yazdıracaktır. 

Python'da istisna kavramını açıklayınız.

Söz diziminden başarılı bir şekilde geçtikten sonra oluşan hatalara istisna denilmektedir. Sayının sıfıra bölünmesi, olmayan bir dosyaya erişim veya içe aktarılmaya çalışılan bir modülün bulunmaması gibi hatalar bunlara örnek verilebilir. Bu şekilde bir çalışma zamanı hatası meydana geldiğinde, Python programlama dili bir istisna nesnesi oluşturmaktadır. Eğer olası hatalar düzgün bir şekilde ele alınarak kullanıcıyı uyarmazsa, yorumlayıcı hatanın neden olduğu hakkında bir geri bildirimi ekrana yazdıracaktır.

Kod:

sayi1 = int(input("Birinci Sayıyı giriniz :"))

sayi2 = int(input("İkinci Sayıyı giriniz :"))

bolum = sayi1/sayi2

print("Sonuc :", bolum)

Kod Çıktısı:

Birinci Sayıyı giriniz :3

İkinci Sayıyı giriniz

Traceback (most recent call last):

       File "D:\Project Python\unite05.py", line 4, in

          bolum = sayi1/sayi2

        ZeroDivisionError: division by zero

Örnek kodda, ikinci girilen sayı için sıfır kontrolü eklenmedi ve kullanıcı sıfır değerini girdiğinde sıfıra bölünme hatası verdi.

Python yerleşik istisnalarından EOFError, OSError ve RuntimeError hatalarının nedenlerini açıklayınız.

EOFError: input() fonksiyonu ile işlem yaparken dosya sonuna ulaştığında tetiklenir.

OSError: Bir sistem işlemi, işletim sistemi ile ilgili bir hataya neden olduğunda tetiklenir

RuntimeError: Karşılaşılan hata başka bir kategoriye dahil edilemediğinde tetiklenir.

print(dir(locals()['__builtins__']))

Yukarıdaki kod satırını açıklayınız.

locals()[‘__builtins__’] fonksiyonu yardımıyla, dahili istisnalar, fonksiyonlar ve niteliklerden oluşan bir modül elde edilir. Elde edilen bu modülün özniteliklerinin metin dizeleri olarak listelenmesi ise “dir” fonksiyonu vasıtasıyla gerçekleşir.

Python'da yerleşik istisnalardan UnicodeError, ValueError, ZeroDivisionError hatalarının nedenlerini açıklayınız.

UnicodeError: Unicode karakterler ile ilgili bir kodlama veya kod çözme hatası gerçekleştiğinde tetiklenir.

ValueError: Bir fonksiyon doğru türde fakat uygun olmayan değerde bir parametre aldığında tetiklenir.

ZeroDivisionError: Mod alma ya da bölme işleminin ikinci işleneni sıfır olduğunda tetiklenir.

Python'da hata yakalamak için kullanılan ifade nedir? Örnek kod ile açıklayınız.

Hata yakalamak için try ifadesi kullanılmaktadır. Kod içerisinde bir hata/istisna oluşturabilecek durumlar try cümleciği içerisinde yazılır. Kodun üreteceği herhangi bir hata durumunda, except yan cümleciği içerisinde yazılan kod bloğu çalışacaktır. Böylece bir hata durumunda yapılması gereken işlem kullanıcı tarafından belirlenmiş olacaktır.

Kod:

# istisna türünü alabilmek için sys modülünü içe aktarma

import sys

liste = [5.7, 0,'R', 7, 2]

for eleman in liste:

       try:

             print("Eleman:", eleman)

             ters = 1/int(eleman)

             print(eleman, "tersi:", ters)

      except:

             print("Hata ", sys.exc_info()[0], "oldu.")

             print("Sonraki eleman")

             print()

Kod Çıktısı:

Eleman: 5.7

5.7 tersi: 0.2

Eleman: 0

Hata <class 'ZeroDivisionError'> oldu.

Sonraki eleman

Eleman: R

Hata <class 'ValueError'> oldu.

Sonraki eleman

Eleman: 7

7 tersi: 0.14285714285714285

Eleman: 2

2 tersi: 0.5

Örnek kodda, listenin değerleri arasında yapılan işlemlerde bir istisna/hataya neden olabileceği düşünülen kısım, try bloğu içerisinde yerleştirilmiştir. Herhangi bir hata oluşmazsa, “except” bloğu atlanarak işlemlere devam edilir. Hata olduğunda ise “except” bloğu içerisindeki kod çalıştırılır ve for döngüsünün işlemine devam edilir.

Python'da hata yakalamada except ifadesinin rolünü açıklayınız.

Program yazarken tüm hataları aynı şekilde ele alan bir kod hazırlanması tavsiye edilen bir durum değildir. Bir hata yakalanırken except ifadesi ile hangi türde hataların yakalanması gerektiği belirtilebilir. Kod içerisindeki try ifadesi ise birden fazla except ifadesine sahip olabilir. Herhangi bir hata oluştuğu durumda ise sadece bir except ifadesi çalıştırılacaktır. Bir except ifadesi içinde de bir değer kümesi ile farklı hatalar tanımlanabilmektedir.

Kod:

try:

    # kod bloğu

    pass

except ValueError:

    # ValueError hatasının yakalanması

     pass

except ( ZeroDivisionError, TypeError ):

# çoklu hata yakalama

# ZeroDivisionError ve TypeError

pass

except:

   # kalan diğer tüm hataların yakalanması

   pass

Bu ünitenin sorularını uygulamada çözŞıklar, doğru cevaplar ve süreli sınav modu AÖF Soru Bankası uygulamasında