EEM-241 İleri Düzey Programlama
2024-2025 Güz Dönemi
Ders 9 - Dosya İşlemleri ve Nesne Yönelimli Programlamaya Giriş
1. Dosya yolları ve dosya kipleri
Temel kipler:
r: okuma; dosya yoksa hata verir.w: yazma; dosya varsa içeriğini silerek yeniden yazar.a: sona ekleme.
Bağıl yollar, programın çalıştığı klasöre göre yorumlanır. .. bir üst klasörü ifade eder.
2. Dosya okuma
Dosyanın işlem sonunda kapanmasını garanti etmek için with kullanılır.
with open("dosyalar/a.txt", "r", encoding="utf-8") as dosya:
icerik = dosya.read()
print(icerik)
Satır satır okuma, büyük dosyalarda tüm içeriği belleğe almamayı sağlar:
with open("dosyalar/a.txt", "r", encoding="utf-8") as dosya:
for satir_no, satir in enumerate(dosya, start=1):
print(satir_no, satir.rstrip())
3. Dosyaya yazma ve ekleme
metin = "123,234,abc\n"
with open("dosyalar/sonuc.txt", "w", encoding="utf-8") as dosya:
dosya.write(metin)
with open("dosyalar/sonuc.txt", "a", encoding="utf-8") as dosya:
dosya.write("456,567,def\n")
Uygulama: Ölçümleri dosyaya kaydetme
olcumler = [12.4, 13.1, 11.9, 12.8]
with open("dosyalar/olcumler.txt", "w", encoding="utf-8") as dosya:
for olcum in olcumler:
dosya.write(f"{olcum}\n")
okunan_olcumler = []
with open("dosyalar/olcumler.txt", "r", encoding="utf-8") as dosya:
for satir in dosya:
okunan_olcumler.append(float(satir.strip()))
print(sum(okunan_olcumler) / len(okunan_olcumler))
4. Hataları kontrollü ele alma
dosya_adi = input("Okunacak dosya: ")
try:
with open(dosya_adi, "r", encoding="utf-8") as dosya:
print(dosya.read())
except FileNotFoundError:
print("Dosya bulunamadı.")
Yalnızca beklenen hata türü yakalanmalıdır; genel except gerçek programlama hatalarını gizleyebilir.
5. Sınıf ve nesne
Sınıf bir şablon, nesne ise bu şablondan oluşturulan örnektir.
class Kisi:
def __init__(self, isim, yas):
self.isim = isim
self.yas = yas
def bilgi(self):
return f"{self.isim} isimli kişinin yaşı: {self.yas}"
ogrenci = Kisi("Ali", 22)
print(ogrenci.isim)
print(ogrenci.bilgi())
__init__: nesne oluşturulurken çalışır.self: üzerinde işlem yapılan nesneyi gösterir.self.isim,self.yas: nesne özellikleridir.bilgi: nesne metodudur.
6. Veriyi ve davranışı aynı sınıfta toplama
class Direnc:
def __init__(self, ohm):
if ohm <= 0:
raise ValueError("Direnç pozitif olmalıdır.")
self.ohm = ohm
def akim(self, gerilim):
return gerilim / self.ohm
def guc(self, gerilim):
return gerilim ** 2 / self.ohm
def __str__(self):
return f"{self.ohm} Ω direnç"
r1 = Direnc(100)
print(r1)
print(r1.akim(12))
print(r1.guc(12))
7. Kalıtım
class Ogrenci(Kisi):
def __init__(self, isim, yas, sinif):
super().__init__(isim, yas)
self.sinif = sinif
def sinif_bilgisi(self):
return f"{self.isim}, {self.sinif}. sınıfta"
ogrenci = Ogrenci("Ayşe", 21, 3)
print(ogrenci.bilgi())
print(ogrenci.sinif_bilgisi())
super() üst sınıfın davranışını yeniden kullanır.
8. Metot ezme ve çok biçimlilik
import math
class Sekil:
def alan(self):
raise NotImplementedError
class Dikdortgen(Sekil):
def __init__(self, uzunluk, genislik):
self.uzunluk = uzunluk
self.genislik = genislik
def alan(self):
return self.uzunluk * self.genislik
def __str__(self):
return f"{self.genislik} × {self.uzunluk} dikdörtgen"
class Daire(Sekil):
def __init__(self, yaricap):
self.yaricap = yaricap
def alan(self):
return math.pi * self.yaricap ** 2
def __str__(self):
return f"Yarıçapı {self.yaricap} olan daire"
Farklı sınıflar aynı metot adıyla kullanılabilir:
sekiller = [Dikdortgen(10, 20), Daire(5)]
for sekil in sekiller:
print(sekil, "alan:", sekil.alan())
9. Özel metotlar ve operatörler
__str__ kullanıcıya yönelik metni, __repr__ geliştiriciye yönelik gösterimi belirler. Karşılaştırma için __lt__ tanımlanabilir.
class Dikdortgen:
def __init__(self, uzunluk, genislik):
self.uzunluk = uzunluk
self.genislik = genislik
def alan(self):
return self.uzunluk * self.genislik
def __repr__(self):
return f"Dikdortgen({self.uzunluk}, {self.genislik})"
def __lt__(self, diger):
return self.alan() < diger.alan()
sekiller = [Dikdortgen(3, 8), Dikdortgen(5, 5), Dikdortgen(2, 4)]
print(sorted(sekiller))
10. Bütünleştirici örnek: Öğrenci kayıtları
class OgrenciKaydi:
def __init__(self, numara, isim, notlar=None):
self.numara = numara
self.isim = isim
self.notlar = [] if notlar is None else notlar.copy()
def not_ekle(self, not_degeri):
if 0 <= not_degeri <= 100:
self.notlar.append(not_degeri)
else:
raise ValueError("Not 0-100 arasında olmalıdır.")
def ortalama(self):
if not self.notlar:
return None
return sum(self.notlar) / len(self.notlar)
def dosya_satiri(self):
not_metni = ",".join(str(not_) for not_ in self.notlar)
return f"{self.numara};{self.isim};{not_metni}\n"
ogrenciler = [
OgrenciKaydi(101, "Ali", [70, 80]),
OgrenciKaydi(102, "Ayşe", [90, 95])
]
with open("dosyalar/ogrenciler.txt", "w", encoding="utf-8") as dosya:
for ogrenci in ogrenciler:
dosya.write(ogrenci.dosya_satiri())
Bu örnek; sınıf, liste, fonksiyon, doğrulama, döngü ve dosya yazmayı aynı problemde birleştirir.
Alıştırmalar
- Dosyadaki sayıları okuyup en küçük, en büyük ve ortalama değeri yazdırın.
BankaHesabisınıfını; para yatırma, para çekme ve bakiye gösterme metotlarıyla oluşturun.Sekilsınıfından türeyenUcgensınıfını ekleyin.Direncnesnelerini direnç değerine göre sıralamak için__lt__tanımlayın.- Bir sensör sınıfı oluşturun; ölçüm ekleyin, ortalamayı hesaplayın ve ölçümleri dosyaya kaydedin.
Çalışma projesi önerisi
Bir ölçüm takip programı yazın. Program;
- kullanıcıdan sensör adı ve sayısal ölçümler alsın,
- geçersiz girişleri denetlesin,
- ölçümleri bir nesnede saklasın,
- en küçük, en büyük ve ortalama değerleri hesaplasın,
- sonucu UTF-8 metin dosyasına yazsın.