#Что означает ошибка
FileNotFoundError
FileNotFoundError: [Errno 2] No such file or directory в Python означает, что файл или каталог по указанному пути не найден. Чаще всего дело в относительном пути: он считается от текущей рабочей директории, а не от расположения скрипта.
Другие причины — опечатка, неверный слэш, отсутствие каталога при записи.
Файл не найден из-за неверного пути или текущего каталога. Используйте pathlib и абсолютные пути.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Неверный путьСтрока. | Имя файла ошибочно или отличается регистром | Сравните реальный путь и имя в файловом менеджере. |
| Другой cwdКаталог. | Скрипт запущен из другого текущего каталога | Узнайте os.getcwd() или стройте путь от __file__, если подходит. |
| Слеши WindowsЭкранирование. | В Windows обратная косая черта прочитана как управляющий символ | Используйте pathlib или корректно экранируйте путь. |
| Файл не созданОжидание. | Файл ещё не создан либо диск отключён | Найдите исходный файл или восстановите носитель, не создавайте пустую замену. |
#Пошаговое решение
- Выведите текущую папкуВ сообщении
FileNotFoundErrorнайдите часть[Errno 2] ...: '...'— это путь, который программа пыталась открыть. В терминале проекта выполнитеpython -c "import os; print(os.getcwd())"(илиpython3в Linux/macOS, если так запускаете проект). Текущий каталог выполнения не всегда совпадает с местом расположения файла.py; в редакторе и при запуске службы он может отличаться. Запишите полный путь из исключения и текущий каталог. - Проверьте существование файлаВ исходном скрипте перед
open(...)временно добавьтеfrom pathlib import Path; print(Path(path).resolve(), Path(path).exists()), гдеpath— ваша переменная с именем файла.Falseозначает, что файла по рассчитанному пути нет;Trueпри ошибке может означать, что проверяется не тот путь или файл исчезает между операциями. Если это сетевой или подключаемый диск, проверьте его доступность. Не создавайте пустой файл вместо отсутствующего пользовательского документа. - Используйте pathlibЕсли файл должен лежать рядом со скриптом, в коде используйте
from pathlib import Path; BASE_DIR = Path(__file__).resolve().parent; file_path = BASE_DIR / 'data' / 'settings.json'. Эта запись вычисляет путь от файла Python независимо от каталога запуска (но в интерактивном Jupyter__file__нет — там нужен иной способ). Проверьтеprint(file_path)и существование файла. Если файл задаётся аргументом пользователя, наоборот, не подменяйте его путь расположением скрипта. - Создайте нужные каталогиЕсли программа создаёт новый файл, сначала определите допустимый каталог и создайте только папку назначения:
file_path.parent.mkdir(parents=True, exist_ok=True); затем выполняйте запись черезwith file_path.open('w', encoding='utf-8') as f:. Эта команда изменяет файловую систему, поэтому предварительно проверьтеfile_path, чтобы не создать каталоги в неожиданном месте; для чтения существующего файлаmkdirпроблему не решает. При ошибкеPermissionErrorнужен отдельный разбор прав. - Проверьте имя и расширениеВ Проводнике Windows откройте «Вид» → «Показать» → «Расширения имён файлов» (Windows 11; в Windows 10 это флажок на вкладке «Вид»), чтобы увидеть
file.txt.txtи другие скрытые окончания. В Linux/macOS выполнитеls -laв ожидаемой папке; регистр букв там обычно важен. Проверьте имя, расширение и кодировку в строковом литерале пути, исправьте опечатку в программе и повторите чтение. Если файл действительно отсутствует, восстановите его из проверенного источника.
#Диагностика пути
Перед открытием файла выведите путь и текущую папку: import os; print(os.getcwd()); print(os.path.abspath("data.txt")); print(os.path.exists("data.txt")). Если exists — False, путь неверный. Запускайте скрипт из нужного каталога или используйте путь относительно файла скрипта.
#Надёжный путь
Используйте pathlib: from pathlib import Path; BASE = Path(__file__).resolve().parent; f = BASE / "data" / "input.txt"; text = f.read_text(encoding="utf-8"). Так скрипт находит файлы независимо от того, откуда запущен. Для Windows используйте сырые строки r"C:\папка\файл.txt" или прямые слэши.
#Запись и создание каталогов
При записи в несуществующую папку получите ту же ошибку. Создайте её: Path("out").mkdir(parents=True, exist_ok=True). Проверьте расширения (скрытые расширения в Windows: file.txt.txt), регистр имени в Linux, пробелы в конце имени и права доступа. Для PyInstaller и IDE проверьте рабочую папку запуска (PyCharm: Run → Edit Configurations → Working directory).
from pathlib import PathBASE = Path(__file__).resolve().parent # доступно внутри .py, но не всегда в Jupyterf = BASE / 'data' / 'input.txt'print(f, f.exists())#Особенности Windows, IDE и запуска по расписанию
При запуске скрипта двойным щелчком, из планировщика задач или службы текущей папкой оказывается C:\Windows\System32, а не папка скрипта, поэтому относительные пути ломаются. Решение — путь от __file__ или os.chdir(os.path.dirname(os.path.abspath(__file__))) в начале скрипта. В Jupyter Notebook рабочая папка совпадает с расположением блокнота; проверьте %pwd. В Docker путь внутри контейнера отличается от путей хоста: смонтируйте том -v $(pwd)/data:/app/data.