
Dosya okuma ve yazma, en sık kullanılan Python görevlerinden biridir. Buradaki temel hedefiniz iki şeydir: (1) dosyayı doğru kipte (mode) açmak, (2) işiniz bittiğinde dosya tanıtıcısını güvenilir biçimde kapatmak. Python’da bunun standart yolu context manager yaklaşımıdır:
| Satır | Kod |
|---|---|
| 1 | with open('ornek.txt', 'r', encoding='utf-8') as f: |
| 2 | icerik = f.read() |
| 3 | print(icerik) |
Bu desen, blok bittiğinde (hata oluşsa bile) dosyanın kapatılmasına yardımcı olur. with ifadesinin arkasındaki mekanizma, context manager protokolünü (__enter__ / __exit__) standartlaştırır (PEP 343). Bu sayede manuel olarak close() çağırmayı unutma riski azalır.
İlgili resmi kaynaklar: Python Tutorial – Reading and Writing Files, PEP 343 – The with Statement.
Python’da dosya açmanın merkezi API’si open() fonksiyonudur. Resmi referansa göre mode, encoding, newline, errors gibi parametreler davranışı doğrudan etkiler. Ayrıntılı parametre listesi için: Built-in Functions – open().
| Kip | Anlamı | Ne zaman kullanılır? |
|---|---|---|
| 'r' | Okuma (text) | Var olan bir metin dosyasını okumak |
| 'w' | Yazma (text), dosyayı sıfırlar/oluşturur | Yeni içerik yazmak (mevcut içerik gerekiyorsa dikkat) |
| 'a' | Dosya sonuna ekleme (text) | Log benzeri satır eklemek |
| 'rb' | Okuma (ikili / binary) | Görüntü, PDF, ikili veri okumak |
| 'wb' | Yazma (ikili / binary) | İkili veri yazmak |
| 'r+' | Okuma + yazma | Tek dosya üzerinde hem okuma hem güncelleme |
Not: Text kipinde (ör. 'r', 'w') veri türü str olur; ikili (binary) kipte (ör. 'rb', 'wb') veri türü bytes olur. Resmi dokümana göre ikili kiplerde encoding parametresi uygulanmaz; çünkü metin dönüştürme yapılmaz (open() referansı).
Metin dosyalarıyla çalışırken en sık sorun, karakter kodlaması (encoding) kaynaklıdır. Resmi dokümana göre encoding belirtilmezse varsayılan değer platforma bağlıdır. Bu nedenle, özellikle ekip çalışmasında ve farklı işletim sistemlerinde tutarlı davranış istiyorsanız örneklerde olduğu gibi encoding='utf-8' belirtmek iyi bir alışkanlıktır (open() dokümantasyonu).
Text kipinde Python satır sonlarını (\n, \r\n) belirli kurallarla dönüştürebilir. Bu çoğu zaman işinizi kolaylaştırır; ancak CSV gibi biçimlerde satır sonu yönetimi hassas olabilir. CSV modülü dokümantasyonu, CSV okuma/yazma sırasında çoğunlukla newline='' kullanılmasını önerir (csv — CSV File Reading and Writing).
Küçük dosyalar için en basit yaklaşım:
| Satır | Kod |
|---|---|
| 1 | with open('veri.txt', 'r', encoding='utf-8') as f: |
| 2 | metin = f.read() |
| 3 | print(metin) |
Dosya çok büyükse read() bellek kullanımını artırabilir. Bu durumda satır satır okumak daha uygundur.
| Satır | Kod |
|---|---|
| 1 | with open('veri.txt', 'r', encoding='utf-8') as f: |
| 2 | for satir in f: |
| 3 | satir = satir.rstrip('\n') |
| 4 | print(satir) |
Bu desen, dosyayı iterator olarak kullanır ve tipik olarak büyük dosyalarda daha kontrollüdür. rstrip ile satır sonlarını normalize etmek, iş mantığınıza göre faydalı olabilir.
| Satır | Kod |
|---|---|
| 1 | def ilk_n_satir(dosya_yolu, n=10): |
| 2 | with open(dosya_yolu, 'r', encoding='utf-8') as f: |
| 3 | for i, satir in enumerate(f): |
| 4 | if i >= n: |
| 5 | break |
| 6 | yield satir.rstrip('\n') |
'w' kipi dosyayı sıfırlar veya yoksa oluşturur:
| Satır | Kod |
|---|---|
| 1 | satirlar = ['Merhaba', 'Dunya'] |
| 2 | with open('cikti.txt', 'w', encoding='utf-8') as f: |
| 3 | for s in satirlar: |
| 4 | f.write(s + '\n') |
Satır sonunu kendiniz eklediğinize dikkat edin; write() otomatik olarak eklemez.
| Satır | Kod |
|---|---|
| 1 | with open('uygulama.log', 'a', encoding='utf-8') as f: |
| 2 | f.write('Yeni kayit eklendi\n') |
Görüntü veya indirilen bir dosya gibi ikili verilerde text dönüşümü istemezsiniz:
| Satır | Kod |
|---|---|
| 1 | # Kopyalama ornegi (binary) |
| 2 | with open('girdi.bin', 'rb') as src: |
| 3 | veri = src.read() |
| 4 | with open('cikti.bin', 'wb') as dst: |
| 5 | dst.write(veri) |
Resmi dokümanlara göre ikili kipte veri bytes olarak gelir ve encoding kullanılmaz (open()).
with size kaynak yönetimini sağlar; ancak uygulamada dosyanın bulunmaması, izin hatası veya beklenmeyen içerik gibi durumlar olabilir. Bu yüzden dosya işlemlerini try/except ile sarmalamak pratik bir yaklaşımdır:
| Satır | Kod |
|---|---|
| 1 | dosya_yolu = 'veri.txt' |
| 2 | try: |
| 3 | with open(dosya_yolu, 'r', encoding='utf-8') as f: |
| 4 | print(f.read()) |
| 5 | except FileNotFoundError: |
| 6 | print('Dosya bulunamadi:', dosya_yolu) |
| 7 | except UnicodeDecodeError: |
| 8 | print('Encoding uyusmazligi olabilir. encoding parametresini kontrol edin.') |
Encoding uyuşmazlığı olasılığında ilk adım genellikle encoding parametresini açıkça belirlemek ve kaynağın gerçek kodlamasını doğrulamaktır. Varsayılan encoding’in platforma göre değişebileceğini unutmayın (open() referansı).
CSV, “metin dosyası gibi görünen” ama ayrıştırma kuralları olan bir formattır. Python’un standart kütüphanesinde csv modülü bulunur ve resmi doküman, okuma/yazmada newline='' kullanımını özellikle vurgular (csv dokümanı).
| Satır | Kod |
|---|---|
| 1 | import csv |
| 2 | with open('kisiler.csv', 'r', encoding='utf-8', newline='') as f: |
| 3 | okuyucu = csv.reader(f) |
| 4 | for satir in okuyucu: |
| 5 | print(satir) |
satir burada bir liste olur. Ayracı (delimiter) farklıysa csv.reader(f, delimiter=';') gibi ayarlayabilirsiniz. CSV dokümanı, farklı biçimler için dialect yaklaşımından da bahseder.
Sütun adlarıyla çalışmak çoğu genel kullanımda daha okunabilirdir:
| Satır | Kod |
|---|---|
| 1 | import csv |
| 2 | with open('kisiler.csv', 'r', encoding='utf-8', newline='') as f: |
| 3 | okuyucu = csv.DictReader(f) |
| 4 | for kayit in okuyucu: |
| 5 | print(kayit['isim'], kayit['email']) |
| Satır | Kod |
|---|---|
| 1 | import csv |
| 2 | satirlar = [ |
| 3 | ['isim', 'email'], |
| 4 | ['Ada', '[email protected]'], |
| 5 | ['Linus', '[email protected]'], |
| 6 | ] |
| 7 | with open('cikti.csv', 'w', encoding='utf-8', newline='') as f: |
| 8 | yazici = csv.writer(f) |
| 9 | yazici.writerows(satirlar) |
| Satır | Kod |
|---|---|
| 1 | import csv |
| 2 | alanlar = ['isim', 'email'] |
| 3 | kayitlar = [ |
| 4 | {'isim': 'Ada', 'email': '[email protected]'}, |
| 5 | {'isim': 'Linus', 'email': '[email protected]'}, |
| 6 | ] |
| 7 | with open('cikti2.csv', 'w', encoding='utf-8', newline='') as f: |
| 8 | yazici = csv.DictWriter(f, fieldnames=alanlar) |
| 9 | yazici.writeheader() |
| 10 | yazici.writerows(kayitlar) |
Basit bir yapılandırma dosyası gibi anahtar=deger satırlarını okumak için:
| Satır | Kod |
|---|---|
| 1 | def oku_kv(dosya_yolu): |
| 2 | sonuc = {} |
| 3 | with open(dosya_yolu, 'r', encoding='utf-8') as f: |
| 4 | for satir in f: |
| 5 | satir = satir.strip() |
| 6 | if not satir or satir.startswith('#'): |
| 7 | continue |
| 8 | anahtar, deger = satir.split('=', 1) |
| 9 | sonuc[anahtar.strip()] = deger.strip() |
| 10 | return sonuc |
| Satır | Kod |
|---|---|
| 1 | def filtrele(girdi, cikti, kelime): |
| 2 | with open(girdi, 'r', encoding='utf-8') as fin, open(cikti, 'w', encoding='utf-8') as fout: |
| 3 | for satir in fin: |
| 4 | if kelime in satir: |
| 5 | fout.write(satir) |
İki dosyayı aynı with ifadesinde açmak, akışı sadeleştirir. Bu yaklaşım Python tutorial örnekleriyle uyumludur (Reading and Writing Files).
Çözüm: Metin dosyalarında encoding parametresini açıkça belirtin. Resmi doküman, varsayılan encoding’in ortama göre değişebileceğini belirtir (open()).
Çözüm: CSV okuma/yazmada dosyayı newline='' ile açmayı deneyin. Bu, csv modülü dokümantasyonunda önerilen yaygın bir pratiktir (csv).
Çözüm: Standart yaklaşım with open(...) as f: kullanmaktır. with ifadesinin tasarım amacı kaynak yönetimini güvenilir hale getirmektir (PEP 343; ayrıca tutorial örnekleri).
Python’da dosya okuma/yazma işinin omurgası with open() desenidir. Doğru kip (mode) seçimi, metin dosyalarında encoding='utf-8' tercih etmek ve CSV için newline='' gibi ayrıntılar; kodun farklı ortamlarda daha tutarlı çalışmasına yardımcı olur. Daha derine inmek için resmi kaynaklardan Reading and Writing Files ve csv sayfalarını yer imlerine ekleyebilirsiniz.
Yorumlar