A FileNotFoundError occurs in Python when you try to open, read, or access a file that does not exist at the specified path. It is a subclass of OSError and was introduced in Python 3.3 as a more descriptive replacement for the generic IOError. This error is common when working with file paths, especially when the working directory or path separators differ between operating systems.
# ❌ Problem
with open("data.txt") as f: # FileNotFoundError if file doesn't exist
content = f.read()
# ✅ Solution
import os
file_path = "data.txt"
if os.path.exists(file_path):
with open(file_path) as f:
content = f.read()
else:
print(f"File not found: {file_path}")
The most common cause is a simple typo in the file name or path. Python is case-sensitive on Linux/macOS, so Data.txt and data.txt are different files. Always verify the exact file name and path.
If a file is deleted, moved, or renamed between when you check for it and when you open it, you get a FileNotFoundError. Use try/except to handle this gracefully in production code.
Relative paths are resolved from the current working directory, which may not be the directory containing your script. This is a common issue when running scripts from a different directory or in automated environments.
When running scripts from an IDE, the working directory may be set to the project root rather than the script's directory. Use pathlib.Path(__file__).parent to always resolve paths relative to the script file itself.
with open("Data.txt") as f: # FileNotFoundError (file is actually 'data.txt')
content = f.read()
with open("config.json") as f: # FileNotFoundError (file is 'config.JSON')
import os
# ✅ List files in directory to find exact name
print(os.listdir(".")) # Shows all files in current directory
# ✅ Use the correct case-sensitive name
with open("data.txt") as f:
content = f.read()
log_file = "/var/log/app.log"
with open(log_file) as f: # FileNotFoundError if log was rotated/deleted
data = f.read()
log_file = "/var/log/app.log"
try:
with open(log_file) as f:
data = f.read()
except FileNotFoundError:
print(f"Log file not found: {log_file}")
data = ""
except PermissionError:
print(f"No permission to read: {log_file}")
data = ""
# Script is at /home/user/project/script.py
# data.txt is at /home/user/project/data.txt
# But script is run from /home/user/
with open("data.txt") as f: # FileNotFoundError "” CWD is /home/user/, not /project/
import os
from pathlib import Path
# ✅ Build path relative to the script's location
script_dir = Path(__file__).parent
data_file = script_dir / "data.txt"
with open(data_file) as f:
content = f.read()
# ✅ Debug: print current working directory
print(f"CWD: {os.getcwd()}")
# Works in terminal from project root, fails in IDE or CI
with open("src/config/settings.json") as f:
config = json.load(f) # FileNotFoundError in some environments
import json
from pathlib import Path
# ✅ Always resolve from the script's location
BASE_DIR = Path(__file__).resolve().parent.parent # project root
config_path = BASE_DIR / "src" / "config" / "settings.json"
with open(config_path) as f:
config = json.load(f)
FileNotFoundError is a subclass of OSError (formerly IOError) introduced in Python 3.3. It specifically means the file or directory was not found. IOError/OSError is the broader error for all OS-level I/O failures.
Use os.path.exists(path) or Path(path).exists() from pathlib. However, for production code, prefer try/except FileNotFoundError since the file could be deleted between the check and the open call.
Open the file with mode "w" (write) or "a" (append): open("file.txt", "w"). This creates the file if it does not exist. For creating parent directories too, use Path("dir/file.txt").parent.mkdir(parents=True, exist_ok=True).
The working directory is different. IDEs often set the working directory to the project root, while the terminal uses the directory you are in. Use Path(__file__).parent to build paths relative to the script file.
Use pathlib.Path which handles path separators automatically. Avoid hardcoding backslashes (\) or forward slashes (/). Path("dir") / "subdir" / "file.txt" works on all platforms.
Explore 500+ free tutorials across 20+ languages and frameworks.