with open(...)ile dosyaya yazmak ve dosyadan okumak'r','w've'a'kiplerini ayırt etmek- Değişkenleri, döngüleri, fonksiyonları, sözlükleri ve hata yönetimini tek bir programda birleştirmek
Bir program biter bitmez tüm değişkenleri bellekten silinir: oyundaki rekor, defterdeki notlar, alışveriş listesi... Hepsi kaybolur. Verileri saklamak için onları bir dosyaya yazmak gerekir. Bu derste dosyalarla çalışmayı öğrenecek, ardından kurs boyunca öğrendiğin her şeyi gerçek bir projede, yani bir not hesaplayıcıda birleştireceksin.
Dosyaya yazmak ve dosyadan okumak
open() fonksiyonu bir dosyayı açar: ilk argüman dosyanın adı, ikincisi ise kiptir (mod). with ifadesi, blok bittiğinde dosyayı otomatik olarak kapatır; hata olsa bile. encoding='utf-8' ise ğ, ş, ı gibi harflerin doğru saklanmasını sağlar.
| Kip | Anlamı | Dosya zaten varsa |
|---|---|---|
'r' | okuma (varsayılan) | içerik okunur; dosya yoksa FileNotFoundError |
'w' | yazma | eski içerik silinir |
'a' | sona ekleme | yeni metin sona eklenir |
with open('notes.txt', 'w', encoding='utf-8') as f:
f.write('Python is fun\n')
f.write('Files keep data\n')
with open('notes.txt', encoding='utf-8') as f:
for line in f:
print(line.strip())▸ Beklenen çıktı
Python is fun Files keep data
write() satır sonuna yeni satır karakteri eklemez; bu yüzden \n'i kendimiz yazarız. Dosyayı for döngüsüyle satır satır okurken bu \n her satırın sonunda kalır; strip() onu temizler. Tüm satırları bir kerede liste olarak almak için readlines() kullanılır:
with open('log.txt', 'w', encoding='utf-8') as f:
f.write('Day 1: started Python\n')
with open('log.txt', 'a', encoding='utf-8') as f:
f.write('Day 2: learned loops\n')
with open('log.txt', encoding='utf-8') as f:
lines = f.readlines()
print(len(lines), 'lines')
print(lines[-1].strip())▸ Beklenen çıktı
2 lines Day 2: learned loops
Var olmayan bir dosyayı okumaya çalışırsan FileNotFoundError oluşur. Hata yönetimi dersindeki gibi onu try / except ile yakalayabilirsin:
try:
with open('missing.txt', encoding='utf-8') as f:
print(f.read())
except FileNotFoundError:
print('File not found, starting with an empty list.')▸ Beklenen çıktı
File not found, starting with an empty list.
Mini proje: not hesaplayıcı
Bir öğretmen öğrencilerin notlarını basit bir metin dosyasında tutuyor: her satırda bir ad ve virgülle ayrılmış notlar var. Bu biçime CSV (comma-separated values, yani virgülle ayrılmış değerler) denir. Programımız dosyayı okuyacak, hatalı satırları atlayacak, her öğrencinin ortalamasını hesaplayacak ve raporu yeni bir dosyaya yazacak.
- 1Verileri hazırla
Notları
grades.csvdosyasına yaz. Programın nasıl tepki verdiğini görmek için bir satıra bilerek hata (x) koyuyoruz. - 2Dosyayı oku ve ayrıştır
Her satırı
split(',')ile parçalara ayır: ilk parça ad, kalanlar notlardır. Onlarıint()ile sayıya çevir ve bir sözlüğe kaydet. - 3Hataları yakala
int('x')birValueErrorverir; onutry/exceptile yakala, bir uyarı yazdır ve o satırı atla. - 4Hesapla ve raporu yaz
Fonksiyonlarla ortalamayı ve seviyeyi bul, sonuçları
report.txtdosyasına yaz ve kontrol etmek için geri oku.
lines = ['Aysel,5,4,5,5', 'Murad,4,3,4', 'Leyla,5,5,4,5', 'Elvin,3,x,4', 'Nigar,2,3,3']
with open('grades.csv', 'w', encoding='utf-8') as f:
f.write('\n'.join(lines))
journal = {}
with open('grades.csv', encoding='utf-8') as f:
for line in f:
parts = line.strip().split(',')
name = parts[0]
try:
journal[name] = [int(m) for m in parts[1:]]
except ValueError:
print(f'Skipped {name}: bad data')
print(journal)▸ Beklenen çıktı
Skipped Elvin: bad data
{'Aysel': [5, 4, 5, 5], 'Murad': [4, 3, 4], 'Leyla': [5, 5, 4, 5], 'Nigar': [2, 3, 3]}parts[1:] dilimi addan sonraki tüm parçaları alır.Şimdi hesabı iki fonksiyona ayıralım: average ortalamayı, level ise seviyeyi bir kelimeyle döndürür (eşikleri kendimiz seçtik). Bir sözlük üreteci tüm ortalamaları tek satırda hesaplar, sonuç da report.txt dosyasına yazılır:
journal = {'Aysel': [5, 4, 5, 5], 'Murad': [4, 3, 4], 'Leyla': [5, 5, 4, 5], 'Nigar': [2, 3, 3]}
def average(scores):
return sum(scores) / len(scores)
def level(avg):
if avg >= 4.5:
return 'excellent'
elif avg >= 3.5:
return 'good'
elif avg >= 2.5:
return 'satisfactory'
return 'needs help'
averages = {name: average(s) for name, s in journal.items()}
with open('report.txt', 'w', encoding='utf-8') as f:
for name, avg in averages.items():
f.write(f'{name}: {avg:.2f} ({level(avg)})\n')
with open('report.txt', encoding='utf-8') as f:
print(f.read().strip())
print(f'Best average: {max(averages.values()):.2f}')▸ Beklenen çıktı
Aysel: 4.75 (excellent) Murad: 3.67 (good) Leyla: 4.75 (excellent) Nigar: 2.67 (satisfactory) Best average: 4.75
fruits listesindeki her meyveyi ayrı bir satır olarak fruits.txt dosyasına yaz ('w' kipi). Ardından dosyayı oku ve satırlarını 1'den başlayan numaralarla, 1. apple biçiminde yazdır.
fruits = ['apple', 'pomegranate', 'fig']
# 1) write each fruit on its own line to fruits.txt
# 2) read fruits.txt and print: 1. apple, 2. pomegranate, ...▸ Beklenen çıktı
1. apple 2. pomegranate 3. fig
Mini proje: sales.csv dosyasının her satırı ürün,adet,fiyat biçimindedir. Dosyayı oku ve her ürünün kazandırdığı parayı (adet × fiyat) bir sözlükte topla. Hatalı veri içeren satırı try/except ile atla ve Skipped: ile birlikte o satırı yazdır. En sonda ürünleri alfabetik sırayla cup: 2.00 AZN biçiminde, en son da aynı biçimde Total: satırını yazdır.
lines = ['pen,3,0.5', 'notebook,2,1.25', 'bag,1,x', 'pen,4,0.5']
with open('sales.csv', 'w', encoding='utf-8') as f:
f.write('\n'.join(lines))
totals = {}
# 1) read sales.csv line by line: product,quantity,price
# 2) skip bad lines (print Skipped: and the line)
# 3) add quantity * price to totals[product]
# 4) print the products in alphabetical order, then the Total▸ Beklenen çıktı
Skipped: bag,1,x notebook: 2.50 AZN pen: 3.50 AZN Total: 6.00 AZN
Önemli noktalar
with open(ad, kip, encoding='utf-8') as f:dosyayı açar ve blok bitince otomatik olarak kapatır.'r'okur,'w'eski içeriği silip yazar,'a'sona ekler.write()\neklemez; okunan satırlardaki\n'istrip()temizler.- Var olmayan bir dosyayı okumak
FileNotFoundErrorverir; onutry/exceptile yakala. - CSV satırları
split(',')ile parçalara ayrılabilir.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.