Dosyalar Aslında Yollu String'lerdir
Çoğu program eninde sonunda bir dosya okumak ya da yazmak zorunda kalır — konfigürasyonlar, kullanıcı verileri, loglar, CSV çıktıları, küçük cache'ler. Python bu işi tek bir yerleşik fonksiyonla, open() ile, artı her şeyin temiz kapanmasını sağlayan bir with bloğuyla basitleştiriyor.
Yaygın durumlara hep birlikte bakalım.
Tüm Bir Dosyayı Okumak
En sade okuma şekli:
with open("notes.txt") as f:
contents = f.read()
print(contents)
open("notes.txt") dosyayı okuma modunda açar (varsayılan). with bloğu, blok dışına çıkıldığında — bir istisna fırlatılsa bile — Python'un dosyayı kapatacağı anlamına gelir. Kapandıktan sonra f artık kullanılamaz; metin contents içinde yaşar.
contents, tüm dosyayı içeren tek bir string'dir. Küçük dosyalar için uygundur; 2 GB'lik bir log için felakettir.
Satır Satır Okumak
Daha büyük dosyalar için her şeyi belleğe almak yerine üzerinde gez:
with open("big.log") as f:
for line in f:
if "ERROR" in line:
print(line.strip())
Her iterasyon, sonundaki satır sonu dahil bir satır verir — bu yüzden .strip() sık karşımıza çıkar. Satırların listesini istersen f.readlines() bunu yapar, ama genellikle istediğin doğrudan iterasyondur.
Bir Dosyaya Yazmak
Yazmak için ikinci argüman olarak mod ver:
with open("output.txt", "w") as f:
f.write("first line\n")
f.write("second line\n")
Dikkat edilecek iki şey:
"w"üzerine yazar.output.txtzaten varsa,opençalıştığı anda içeriği gider.- Satır sonlarını kendin eklemelisin.
f.write("hello")tam olarak bu beş karakteri yazar — sonunda satır sonu yok.
Üzerine yazmak yerine eklemek için:
with open("output.txt", "a") as f:
f.write("another line\n")
writelines ile tek seferde birden fazla satır da besleyebilirsin:
lines = ["a\n", "b\n", "c\n"]
with open("letters.txt", "w") as f:
f.writelines(lines)
Aynı kural: satır sonlarını sen sağlıyorsun.
Dosyaya print Yapmak
print'in, manuel satır sonları olmadan yazmanın kolay bir yolu olan bir file argümanı var:
with open("log.txt", "w") as f:
print("started", file=f)
print("finished", file=f)
Her print, argümanlarını ve sonuna bir satır sonu yazar. Gündelik çıktı için genelde en güzel form budur.
Metin ve İkili Mod
Varsayılan olarak open metin modundadır. Python byte'ları string'e çevirir (modern platformlarda varsayılanı UTF-8) ve satır sonu çevirilerini yönetir.
Görseller, PDF'ler, derlenmiş dosyalar ya da metin olmayan her şey için moda "b" ekleyerek ikili modda aç:
with open("image.png", "rb") as f:
data = f.read()
print(len(data)) # number of bytes
with open("image_copy.png", "wb") as f:
f.write(data)
İkili modda str yerine bytes nesneleri alırsın ve Python satır sonlarına dokunmaz.
Encoding Belirtmek
Metin dosyaları için encoding konusunda açık ol. 2026'da neredeyse her zaman UTF-8 doğrudur:
with open("notes.txt", encoding="utf-8") as f:
contents = f.read()
Eski bir Windows-only şirketten gelen dosyalarla uğraşıyorsan cp1252 veya latin-1 da görebilirsin. Yanlış tahmin, bozuk karakterler ya da bir UnicodeDecodeError hediye eder.
pathlib: Yolları Modern Şekilde Yönetmek
Standart kütüphanedeki pathlib modülü, düz string'lerden çok daha ergonomik bir API sunar:
from pathlib import Path
path = Path("notes.txt")
# Basit okuma ve yazma.
contents = path.read_text(encoding="utf-8")
path.write_text("new contents\n", encoding="utf-8")
# / ile \ derdine düşmeden yol inşa et.
data_dir = Path("data")
log_path = data_dir / "today.log"
print(log_path)
print(log_path.exists())
print(log_path.suffix) # ".log"
print(log_path.stem) # "today"
print(log_path.parent) # "data"
Path.read_text() ve write_text(), tek seferlik okuma ve yazma istediğinde with open(...) as f kalıbının kısayollarıdır. Satır satır iterasyon için hâlâ open ya da path.open() kullanırsın.
Küçük Uçtan Uca Bir Örnek
Bir dosyadan öğe listesi okumak, filtrelemek ve sonucu başka bir dosyaya yazmak:
from pathlib import Path
source = Path("items.txt")
destination = Path("filtered.txt")
items = source.read_text().splitlines()
kept = [item for item in items if item and not item.startswith("#")]
destination.write_text("\n".join(kept) + "\n")
print(f"Kept {len(kept)} items out of {len(items)}")
splitlines(), join'in satır odaklı yoldaşıdır. Satır sonu karakterlerinden böler ama onları tutmaz — nasılsa parçaları sonra birleştireceksen çok işe yarar.
İşler Ters Gittiğinde
Var olmayan bir dosyayı açmak FileNotFoundError fırlatır. İzninin olmadığı bir dosyayı okumaya çalışmak PermissionError fırlatır. İkisi de OSError'ın alt sınıfıdır; o da Exception'ın alt sınıfıdır — istisnaları düzgünce yönetmeyi sonraki sayfada konuşacağız.
Şimdilik hata yönetiminin nasıl göründüğüne hızlı bir bakış:
from pathlib import Path
path = Path("maybe.txt")
try:
contents = path.read_text()
except FileNotFoundError:
print("File doesn't exist — starting fresh.")
contents = ""
print(repr(contents))
Temel Alışkanlıklar
- Ham
open+ manuel close yerine her zamanwith open(...)kullan. - Metin dosyaları için her zaman
encoding=geç; varsayılan UTF-8 olsun. - Büyük dosyaları satır satır gez; tamamını
.read()ile alma. - Yollar ve yaygın okuma/yazma kalıpları için
pathlibkullan — seni epey string jimnastiğinden kurtarır.
Sırada: JSON. Okuduğun gerçek dünya metin dosyalarının çoğu düz satırlar değil — yapılandırılmıştır ve JSON en yaygın şekildir. Aynı with open(...) alışkanlıkları doğrudan geçerliliğini korur.
Sıkça Sorulan Sorular
Python'da bir dosyayı nasıl okurum?
open()'u with deyimiyle birlikte kullan; işin bittiğinde dosyayı otomatik olarak kapatır. with open('file.txt') as f: contents = f.read() tüm dosyayı tek bir string olarak okur. Satır satır işlemek için doğrudan dosya nesnesi üzerinde döngü kur: for line in f:.
'r', 'w' ve 'a' modları arasındaki fark nedir?
'r' okumadır (varsayılan). 'w' yazmadır — dosyayı oluşturur, varsa içeriğini siler. 'a' eklemedir — mevcut içeriği silmeden dosyanın sonuna yazar. İkili mod için 'b', okuma+yazma için '+' ekle.
Neden düz open yerine with open kullanmalıyım?
open yerine with open kullanmalıyım?with deyimi, blok ortasında bir hata çıksa bile dosyanın kapatılmasını garanti eder. with olmadan .close()'u kendin çağırmak ve hata yollarında bile unutmamak zorundasın. with hem daha güvenli hem daha az kod.