Python FileNotFoundError hatası, Python’un aradığı dosyayı belirtilen yolda bulamadığı anlamına gelir. Dosya betikle aynı klasörde görünse bile program farklı bir çalışma dizininden başlatılmışsa göreli yol yanlış klasöre göre yorumlanabilir. Önce Python’un hangi klasöre baktığını kontrol etmek, ardından oluşturulan dosya yolunun gerçekten var olup olmadığını doğrulamak gerekir.
Python temelini bire bir çalışmak isteyenler için Python özel dersleri kapsamında dosya işlemleri, yollar ve hata ayıklama adım adım ele alınabilir. Ancak bu hatayı çözmenin ilk adımı, dosyanın nerede olduğundan önce programın hangi klasörü başlangıç noktası kabul ettiğini anlamaktır.
FileNotFoundError Neden Oluşur? Önce Python’un Hangi Klasöre Baktığını Anlayın
Python’da bir dosyayı yalnızca adıyla açarsanız, örneğin open("veri.txt") yazarsanız, bu yol göreli yol olarak değerlendirilir. Python, dosyayı çoğu durumda betik dosyasının bulunduğu klasöre göre değil, programın başlatıldığı mevcut çalışma dizinine göre arar.
Bu nedenle şu iki durum birbirinden farklıdır:
- Betik konumu: Python kodunu içeren
.pydosyasının fiziksel olarak bulunduğu klasördür. - Çalışma dizini: Program başlatılırken geçerli kabul edilen ve göreli yolların yorumlandığı klasördür.
Örneğin proje/ klasöründe hem main.py hem de veri.txt bulunabilir. Fakat terminalde başka bir klasördeyken main.py dosyasını farklı bir yoldan çalıştırırsanız veya geliştirme ortamının çalışma dizini proje klasöründen farklı ayarlanmışsa, open("veri.txt") beklediğiniz dosyayı bulamayabilir.
Mutlak yol, dosyanın kök konumdan başlayarak tam adresini ifade eder. Göreli yol ise mevcut çalışma dizinine göre tanımlanır. Mutlak yollar belirli bir bilgisayara veya kullanıcı klasörüne bağımlı olabileceği için taşınabilir projelerde sorun çıkarabilir. Göreli yollar daha esnektir; ancak hangi çalışma dizinine göre yorumlandıkları mutlaka bilinmelidir.
Terminalden çalıştırma ile bir IDE veya kod çalıştırma aracındaki “çalıştır” işlemi aynı çalışma dizinini kullanmayabilir. Bu fark, kullanılan araca göre değişen bir ayardan, proje yapılandırmasından veya komutun çalıştırıldığı klasörden kaynaklanabilir. Dolayısıyla dosyanın aynı klasörde olup olmadığını kontrol etmeden önce çalışma dizinini yazdırmak gerekir.
Üç Adımda Dosya Yolunu Teşhis Edin

FileNotFoundError hatasını tahmin ederek düzeltmek yerine, Python’un gördüğü yolu ve bu yolun dosya sistemindeki durumunu sırayla kontrol edin. Aşağıdaki üç aşama, yanlış çalışma dizini ile hatalı dosya adını birbirinden ayırmayı sağlar.
os.getcwd()ile mevcut çalışma dizinini yazdırın. Bu değer beklediğiniz klasör değilse, göreli dosya yolu yanlış konumda aranıyordur. Önce terminalde doğru klasöre geçin veya çalıştırma yapılandırmasındaki çalışma dizinini düzeltin.Path(...).exists()ile hedef yolun gerçekten var olup olmadığını kontrol edin. SonuçFalseise dosya adı, dosya uzantısı, klasör adı veya hedef konum hatalı olabilir. SonuçTrueise sorun artık doğrudan “dosya yok” probleminden farklı bir aşamada aranmalıdır.- String birleştirme yerine
pathlibile işletim sistemine duyarlı yol kurun. Klasör ve dosya adlarını elle"/"veya""ile birleştirmek yerinePathnesnesinin/operatörünü kullanın.
Teşhis sırasında mevcut çalışma dizinini, oluşturulan hedef yolu ve exists() sonucunu birlikte yazdırmak yararlıdır:
import os
from pathlib import Path
print("Çalışma dizini:", os.getcwd())
hedef = Path("veriler") / "veri.txt"
print("Oluşturulan yol:", hedef)
print("Dosya var mı?:", hedef.exists())
Çıktıdaki çalışma dizini beklenenden farklıysa problem büyük olasılıkla göreli yolun yanlış başlangıç noktasına göre yorumlanmasıdır. Çalışma dizini doğru olduğu hâlde exists() sonucu False veriyorsa dosya adı, uzantı veya klasör yapısı kontrol edilmelidir. Özellikle veri.txt ile veri.csv gibi uzantı farkları ve büyük-küçük harf ayrımı gözden kaçabilir.
Üç Yaygın Hata Türünü Birbirinden Ayırın

FileNotFoundError aldığınızda sorun her zaman dosyanın silinmiş olması değildir. Python’un baktığı çalışma dizini farklı olabilir, dosya adı gerçekten yanlış olabilir veya Windows yolu bir Python kaçış karakteri nedeniyle bozulmuş olabilir. Önce hata mesajını gizlemek yerine oluşturduğunuz yolun ekrana nasıl yansıdığını ve dosyanın bulunup bulunmadığını görünür hâle getirin.
| Hata türü | Tipik belirti | Nasıl doğrulanır? | Kalıcı çözüm |
|---|---|---|---|
| Yanlış çalışma dizini | Dosya gerçekten proje klasöründe olduğu hâlde göreli yol bulunamaz. | Path.cwd() ile Python’un hangi klasörde çalıştığını kontrol edin. |
Göreli yolu bilinçli kullanın veya yolu betiğin konumuna göre oluşturun. |
| Var olmayan dosya ya da yanlış ad | Klasör doğru olsa bile dosya adı, uzantı veya büyük-küçük harf uyuşmaz. | Path.exists() sonucunu ve klasör içeriğini kontrol edin. |
Dosya adını ve uzantıyı doğrulayın; yolu parçalara ayırarak kurun. |
| Kaçış karakteriyle bozulmuş Windows yolu | Yol ekrana beklenenden farklı çıkar veya satır bölünmesi görülür. | repr(yol) ve normal print(yol) çıktısını karşılaştırın. |
pathlib kullanın; ham string veya doğru kaçışlama tercih edin. |
Yanlış çalışma dizini
open("data/notlar.txt") gibi bir göreli yol, dosyanın Python dosyasıyla aynı klasörde olduğunu varsaymaz. Yol, programın başlatıldığı current working directory üzerinden değerlendirilir. IDE, terminal veya test aracı programı farklı bir klasörden çalıştırırsa dosya proje içinde bulunsa bile hata oluşabilir. Bu durumu Path.cwd() ile teşhis etmek, tahmin yürütmekten daha güvenlidir.
Gerçekten var olmayan dosya
Çalışma dizini doğruysa dosya adını kontrol edin. .txt uzantısının gizlenmiş olması, dosya adında yazım hatası bulunması veya klasör adının farklı yazılması sık karşılaşılan nedenlerdir. Göreli yollar, çalıştırma konumuna bağımlı olduğu için; mutlak yollar ise bilgisayar, kullanıcı hesabı veya proje konumu değiştiğinde kırılabildiği için dikkatli kullanılmalıdır.
Windows ters bölü çizgisinin kaçış karakteri olarak yorumlanması
Python string’lerinde ters bölü çizgisi () özel anlam taşıyabilir. Örneğin "data otlar.txt" ifadesindeki , Windows klasör ayıracı olarak değil, yeni satır kaçış karakteri olarak yorumlanır. print(yol) çıktısı beklenmedik biçimde iki satıra bölünebilir. String birleştirme ile bu tür hataları yönetmek zorlaşırken, pathlib yol parçalarını doğrudan / operatörüyle birleştirerek daha okunabilir bir yaklaşım sunar.
pathlib ile Betiğin Kendi Konumuna Göre Güvenilir Yol Kurun
Çalışma dizinine bağlı kalmak yerine yolu, çalışan Python dosyasının bulunduğu klasörden başlatabilirsiniz. Aşağıdaki örnek proje klasöründeki data dizininden notlar.txt dosyasını okur:
from pathlib import Path
def main():
proje_klasoru = Path(__file__).parent
dosya_yolu = proje_klasoru / "data" / "notlar.txt"
if not dosya_yolu.exists():
print(f"Dosya bulunamadı: {dosya_yolu}")
return
icerik = dosya_yolu.read_text(encoding="utf-8")
print(icerik)
if __name__ == "__main__":
main()
data/notlar.txt mevcutsa program dosyanın içeriğini yazdırır. Dosya bilerek silinir veya adı değiştirilirse şu biçimde anlaşılır bir mesaj görürsünüz:
Dosya bulunamadı: .../data/notlar.txt
Buradaki Path(__file__).parent, başlangıç noktasını betiğin bulunduğu klasöre bağlar. / operatörü ise yol parçalarını işletim sisteminin yol kurallarına göre birleştirir; elle ters bölü çizgi eklemekten daha az hata riski taşır. exists() ile okuma işleminden önce kontrol yapılması da hatanın kaynağını görünür kılar. Python dosya işlemlerini uygulamalı tekrar etmek isteyenler, Python dosya işlemlerini uygulamalı tekrar etmek isteyenler için video eğitimlerde aynı yaklaşımı farklı örneklerle pekiştirebilir.
Kullanıcıdan ve Konfigürasyondan Gelen Yolları Nasıl Doğrulamalısınız?
Dosya yolu kullanıcı girdisinden, komut satırından veya bir konfigürasyon dosyasından geliyorsa doğrudan read_text() çağırmak yerine önce yolu doğrulayın. Böylece var olmayan dosya, klasör yerine dosya beklenmesi ve yanlış çalışma dizini gibi durumları birbirinden ayırabilirsiniz. Bu yaklaşım yalnızca FileNotFoundError teşhisi için değil, kodun bakımını kolaylaştırmak için de önemlidir.
- Gelen değeri
Pathnesnesine dönüştürün. exists()ile hedef yolun mevcut olup olmadığını kontrol edin.is_file()ile yolun gerçekten dosyaya işaret ettiğini doğrulayın.- Göreli yol kullanılıyorsa programın hangi çalışma dizininde başlatıldığını değerlendirin.
- Uygulamanın beklediği kök klasörün dışına çıkılmadığını kontrol edin.
- Hata mesajında yalnızca kullanıcının yazdığı ifadeyi değil, Python’un oluşturduğu gerçek yolu da gösterin.
- Öngörülen durumları ayrı ayrı ele alın; geniş bir
try-exceptbloğuyla bütün hataları gizlemeyin.
Örneğin exists() sonucu False ise dosya bulunamamıştır. Sonuç True olduğu hâlde is_file() sonucu False ise verilen yol büyük olasılıkla bir klasördür. Bu ayrım, kullanıcıya “dosya bulunamadı” demek yerine sorunun gerçek nedenini açıklamanızı sağlar.
Beklenen kök klasör kontrolü özellikle dışarıdan alınan yollarda yararlıdır. Kullanıcının yalnızca uygulamanın belirli bir klasörü içindeki dosyalara erişmesi gerekiyorsa, oluşturulan yolun bu sınır içinde kalıp kalmadığı ayrıca değerlendirilmelidir. Bu konu güvenlik boyutu taşısa da burada temel hedef, hatalı yolun neden FileNotFoundError oluşturduğunu görünür hâle getirmektir. Temel seviyenizi kontrol etmek için Python bilgi seviyesini ölçen ücretsiz test sayfasını kullanabilirsiniz.
- “Dosya aynı klasörde mi?” sorusundan önce “Program hangi çalışma dizininde?” sorusunu sorun.
Pathile hangi hedef yolu oluşturduğunuzu kontrol edin.exists()ve gerekiyorsais_file()sonuçlarını inceleyin.
Sık Sorulan Sorular
Dosya Python betiğiyle aynı klasörde olduğu hâlde neden FileNotFoundError alıyorum?
Göreli yollar betiğin bulunduğu klasöre göre değil, programın başlatıldığı çalışma dizinine göre değerlendirilir. os.getcwd() ile çalışma dizinini yazdırın; betiğin konumuna göre yol kurmanız gerekiyorsa Path(__file__).parent kullanın.
os.getcwd() ile Path(__file__).parent arasındaki fark nedir?
os.getcwd() programın çalıştırıldığı anki çalışma dizinini gösterir. Path(__file__).parent ise Python dosyasının bulunduğu klasörü temel alır. Bu iki konum aynı olmak zorunda değildir.
Windows dosya yollarında ters bölü çizgisi neden hata oluşturabilir?
Python dizelerinde ters bölü çizgisi kaçış karakteri olarak yorumlanabilir. Bu nedenle yol ifadelerinde ham dizeler, ileri bölü çizgiler veya pathlib kullanmak daha güvenlidir.
pathlib kullanırken exists() ve is_file() kontrolleri birlikte yapılmalı mı?
Dosya okunacaksa birlikte yapılması yararlıdır. exists() yolun bulunduğunu, is_file() ise bu yolun klasör değil dosya olduğunu gösterir.
Kullanıcıdan alınan dosya yolunu Python’da nasıl güvenli biçimde doğrularım?
Girdiyi Path nesnesine dönüştürün, exists() ve is_file() sonuçlarını kontrol edin, gerekiyorsa beklenen kök klasör sınırını doğrulayın. Hataları ayrı ve açıklayıcı mesajlarla yönetin.
Doğru teşhis için dosyanın nerede göründüğünden önce Python’un hangi yolu değerlendirdiğini inceleyin; ardından oluşturulan Path nesnesini ve kontrol sonuçlarını doğrulayın.