Python'da io.UnsupportedOperation hatası dosya işlemlerinde, açma modunun izin vermediği bir yöntemi çağırdığında çıkar. io.UnsupportedOperation, akışın desteklemediği bir işlem çağrıldığında oluşur. Dosyaya write(), read() ya da seek() ile yapmak istediğin işlem, open() içinde seçtiğin modla uyuşmuyorsa Python bu hatayı verir.
Çözüm kodu susturmak değildir. Önce dosyayla ne yapacağına karar ver: okumak, baştan yazmak ya da sona eklemek. Modu ondan sonra seç.
r modunda açılan dosyaya write() çağırınca ne olur?
open() fonksiyonunda mod belirtmezsen dosya varsayılan olarak 'r' (yalnızca okuma) modunda açılır. Bu moddaki dosya nesnesine yazmaya çalışırsan hata alırsın:
f = open('notlar.txt', 'r')
f.write('merhaba')
f.close()
Programı çalıştırdığında traceback'in son satırı şöyle olur:
io.UnsupportedOperation: not writable
Mesajın tam metni Python'un çalıştığı ortama göre farklılık gösterebilir. Bazı ortamlarda ek açıklama içeren ya da başka sözcüklerle yazılmış bir ifade görebilirsin. Hatayı kodda yakalaman gerekirse mesaj metnine bakma, hata türüne güvenmen gerekir. Bunu makalenin son bölümünde göstereceğim.
Bu hata, yazdığın satırın yanlış olduğunu söylemez. f.write('merhaba') kendi başına geçerli bir çağrıdır. Hata, açtığın akışın o işleme izin vermediğini bildirir. Yani sorun yazma satırında değil, bir üstteki open() satırındaki moddadır.
Ters yönde de aynı mantık işler. 'w' modunda açılmış bir dosyada read() çağırırsan bu kez io.UnsupportedOperation: not readable benzeri bir mesaj alırsın. Dosya 'r' modunda açılmak istendiğinde yoksa ise bambaşka bir hata, FileNotFoundError çıkar. İkisi karıştırılmamalıdır.
w veya a ile düzeltme: hangisini seçmelisin?

Yazmak istiyorsan modu yazmaya uygun olanla değiştir. İki seçenek var ve aralarındaki fark dosyadaki mevcut içeriğe ne olacağıdır.
w ile baştan yazma
with open('notlar.txt', 'w') as f:
f.write('merhaban')
Dosya yoksa oluşturulur. Varsa içeriği silinir ve dosya baştan yazılır. Çalıştırdıktan sonra notlar.txt içinde yalnızca şu satır bulunur:
merhaba
a ile sona ekleme
with open('notlar.txt', 'a') as f:
f.write('ikinci satırn')
'a' (append) modu mevcut içeriği korur, yazdığını dosyanın sonuna ekler. Dosya yoksa bu mod da onu oluşturur. Önceki örneğin ardından bunu çalıştırırsan dosya şöyle olur:
merhaba
ikinci satır
Kısaca: önceki veriyi korumak istiyorsan 'a', dosyayı sıfırdan oluşturmak istiyorsan 'w' kullan. with bloğu dosyayı iş bitince kendiliğinden kapatır, bu yüzden close() çağırmayı unutma riskin kalmaz.
Ters durum: yazma modunda okumak
with open('notlar.txt', 'w') as f:
f.write('merhaban')
print(f.read())
Çıktı, traceback'in son satırında şuna benzer bir hata olur:
io.UnsupportedOperation: not readable
Çözüm yine mod seçimidir. Dosyayı okumak istiyorsan 'r' ile aç. Yazma ve okumayı aynı açılışta yapman gerekiyorsa + içeren modlar vardır, bunları karar tablosunda karşılaştıracağız.
Bu hatayı try/except ile yutmak sorunu çözmez. Yazma işlemi gerçekleşmez, dosya da değişmez, ama programın hata verdiğini fark etmezsin. Modu işleme uyacak şekilde düzeltmek her zaman daha sağlam yoldur.
Önce işlemi, sonra modu seç: mod karar tablosu
Mod seçmeden önce dosyayla ne yapacağını yaz. Aşağıdaki tablo, metin modundaki (varsayılan) altı temel modun davranışını Python belgelerindeki open() açıklamasıyla uyumlu biçimde özetler. İkili mod (b eki) bu yazının kapsamı dışında kalır.
| Yapmak istediğin işlem | Mod | Okuma | Yazma | Dosya yoksa | Var olan içeriğe ne olur |
|---|---|---|---|---|---|
| Yalnızca oku | r | Evet | Hayır | FileNotFoundError | Korunur |
| Sıfırdan yaz | w | Hayır | Evet | Oluşturur | Silinir |
| Sona ekle | a | Hayır | Evet | Oluşturur | Korunur, yazılanlar sona eklenir |
| Hem oku hem yaz, dosya zaten var | r+ | Evet | Evet | FileNotFoundError | Silinmez, ancak yazılan yer konuma göre üzerine yazılır |
| Hem oku hem yaz, baştan başla | w+ | Evet | Evet | Oluşturur | Silinir |
| Hem oku hem sona ekle | a+ | Evet | Evet | Oluşturur | Korunur; yazma her zaman sona gider, okumak için önce seek(0) gerekir |
Tabloyu soldan sağa oku: önce işlemini dört seçenekten biriyle adlandır (sadece oku, sıfırdan yaz, sona ekle, hem oku hem yaz). Sonra o işleme uyan modu bul ve dosya yoksa ya da içerik doluysa ne olacağına bak. Mod ne kadar dar seçilirse hata mesajı o kadar erken ve anlaşılır gelir; yalnızca okuyacaksan r, yalnızca ekleyeceksen a yeterlidir.
w ve w+ içeriği siler: veri kaybını nasıl önlersin?

w ya da w+ ile açtığın anda, tek bir satır yazmasan bile, dosyanın eski içeriği silinir. io.UnsupportedOperation hatasını çözmek için modu r'den w'ye çevirmek hızlı bir çözüm gibi görünür. Ama yanlış dosyada bu değişiklik veri kaybettirebilir. Dosyaya eklemek istiyorsan a, hem okuyup hem değiştirmek istiyorsan r+ daha uygun olabilir.
Önemli bir dosyada emin değilsen önce kopyası üzerinde deneyebilirsin. Aşağıdaki örnekte notlar.txt dosyasının içinde Matematik: 85 yazdığını varsayalım:
import shutil
shutil.copy("notlar.txt", "notlar_deneme.txt")
with open("notlar_deneme.txt", "w+") as f:
print(repr(f.read()))
with open("notlar.txt", "r") as f:
print(f.read())
Beklenen çıktı:
''
Matematik: 85
İlk satır, kopyanın w+ ile açılır açılmaz boşaldığını gösterir. İkinci satır, asıl dosyanın etkilenmediğini gösterir. Kopya almak yararlı bir alışkanlıktır ama tek koruma yolu değildir; dosyayı farklı bir klasörde ya da başka bir ortamda yedeklemek de aynı amaca hizmet eder. Yine de hiçbir yöntem, yanlış açılmış bir asıl dosyada oluşan kaybı geri getirmeyi garanti etmez.
Mod seçimini ne kadar oturttuğunu görmek istiyorsan ücretsiz Python bilgi testini çözüp dosya işlemleri ve temel sözdizimi sorularındaki durumuna bakabilirsin.
seek() ile çıkan hata neden farklıdır?
Buraya kadarki hatalar yanlış mod yüzünden çıkıyordu. seek() hatası iki ayrı nedenden gelebilir: metin modunda istediğin konumlandırma türü desteklenmiyordur ya da akışın kendisi baştan sona ilerleyen türdendir ve geri sarılamaz.
Metin modunda göreli seek
Metin modunda dosya başına (seek(0)) ve sonuna (seek(0, 2)) gidebilirsin. Bulunduğun konumdan sıfırdan farklı bir adım atmak (seek(5, 1)) ise hata verir.
import io
with open("not.txt", "w", encoding="utf-8") as f:
f.write("merhaba dunyan")
with open("not.txt", "r", encoding="utf-8") as f:
f.read(3)
try:
f.seek(5, 1)
except io.UnsupportedOperation as e:
print("hata:", e)
print(f.seek(0))
print(f.seek(0, 2))
Beklenen çıktı:
hata: can't do nonzero cur-relative seeks
0
14
Son iki satır, seek() çağrılarının döndürdüğü yeni konumdur. Bu Python'ın bilinen davranışıdır: metin modunda karakter kodlaması yüzünden bayt konumu ile karakter konumu birebir örtüşmez. Göreli ilerlemek gerekiyorsa dosyayı "rb" gibi ikili modda açabilirsin, ancak o zaman okuduğun veri bayt olarak gelir.
Geri sarılamayan akışlar
Klavye girişi ya da bir boru (pipe) ile bağlanan akışlar çoğu zaman rastgele erişimi desteklemez. Bu akışlarda seek(0) bile hata verebilir. Bunu denemeden önce nesneye sorabilirsin. readable(), writable() ve seekable() yöntemleri, io modülü belgesinde anlatıldığı gibi akışın okunup yazılabildiğini ve rastgele erişimi destekleyip desteklemediğini True ya da False olarak döndürür.
with open("not.txt", "r", encoding="utf-8") as f:
print(f.readable(), f.writable(), f.seekable())
Beklenen çıktı:
True False True
Okuma modundaki sıradan bir dosya okunabilir, yazılamaz ve geri sarılabilir. Çıktıdaki False değeri, bir sonraki hatanın nereden geleceğini önceden gösterir.
Kontrol listesi ve hatayı doğru yakalama
Dosya işlemlerinde hatayı baştan önlemek için şu dört adımı sırayla uygulayabilirsin:
- Önce yapacağın işlemi yaz: oku, sıfırdan yaz, sona ekle ya da hem oku hem yaz.
- Sonra karar tablosundan moda bak ve işleme uyan modu seç.
- Dosyayı
withile aç; kapatmayı Python üstlensin. - Şüphede kalırsan dosya nesnesinin
modeözelliğine bak.
with open("not.txt", "a", encoding="utf-8") as f:
print(f.mode)
Beklenen çıktı:
a
Dosyayı hangi modla açtığını unuttuğunda bu satır, kodu baştan okumaktan daha hızlı yanıt verir.
Hatayı türüne göre yakala
Hatayı yakalamak istersen io modülünü içe aktarıp türü belirtebilirsin:
import io
with open("not.txt", "r", encoding="utf-8") as f:
try:
f.write("yeni satır")
except io.UnsupportedOperation:
print("Bu dosya yazma için açılmamış.")
Beklenen çıktı:
Bu dosya yazma için açılmamış.
Burada ölçüt hata mesajının metni olmamalı. Mesaj, ortama ve çalıştırma biçimine göre değişebilir; örneğin not writable yerine başka bir ifade görebilirsin. Bu yüzden "not writable" in str(e) gibi bir karşılaştırma kırılgandır. Hata türü ise sabittir. Yakalamayı da çoğu durumda modu düzeltmenin yedeği olarak düşün. except bloğu hatayı susturabilir ama yanlış modla açılmış dosyayı düzeltmez.
Dosya içeriğini okurken karşına çıkan UnicodeDecodeError gibi hatalar ise dosyanın karakter kodlamasıyla ilgili ayrı bir sorundur ve bu yazının konusu değildir.
Bir sonraki dosya programına başlamadan önce Python bilginin ya da farklı dil ve konulardaki seviyenin nerede durduğunu merak edersen ücretsiz bilgi testleri merkezini deneyebilirsin.