İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Python io.UnsupportedOperation Hatası Dosya İşlemlerinde Nasıl Çözülür?

python-io-unsupportedoperation-hatasi
Bu yazıda neler var?
  1. r modunda açılan dosyaya write() çağırınca ne olur?
  2. w veya a ile düzeltme: hangisini seçmelisin?
  3. Önce işlemi, sonra modu seç: mod karar tablosu
  4. w ve w+ içeriği siler: veri kaybını nasıl önlersin?
  5. seek() ile çıkan hata neden farklıdır?
  6. Kontrol listesi ve hatayı doğru yakalama

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?

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şlemModOkumaYazmaDosya yoksaVar olan içeriğe ne olur
Yalnızca okurEvetHayırFileNotFoundErrorKorunur
Sıfırdan yazwHayırEvetOluştururSilinir
Sona ekleaHayırEvetOluştururKorunur, yazılanlar sona eklenir
Hem oku hem yaz, dosya zaten varr+EvetEvetFileNotFoundErrorSilinmez, ancak yazılan yer konuma göre üzerine yazılır
Hem oku hem yaz, baştan başlaw+EvetEvetOluştururSilinir
Hem oku hem sona eklea+EvetEvetOluştururKorunur; 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 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:

  1. Önce yapacağın işlemi yaz: oku, sıfırdan yaz, sona ekle ya da hem oku hem yaz.
  2. Sonra karar tablosundan moda bak ve işleme uyan modu seç.
  3. Dosyayı with ile aç; kapatmayı Python üstlensin.
  4. Şü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.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara