Удаление файлов и директорий в Python
Как удалять файлы и директории в Python с помощью os.remove, pathlib.Path.unlink, os.rmdir и shutil.rmtree с безопасной обработкой ошибок.
В этой главе рассмотрены все стандартные способы удаления файлов и директорий в Python — от классического модуля os до современного API pathlib и модуля shutil для непустых директорий. Вы также узнаете безопасные шаблоны обработки ошибок, чтобы ваш код корректно работал при отсутствии файла или отказе в доступе.
Удаление одного файла
Использование os.remove()
Модуль os входит в стандартную библиотеку Python и предоставляет переносимый интерфейс к функциям операционной системы. os.remove() удаляет один файл. Функция вызывает FileNotFoundError, если путь не существует, и PermissionError, если у процесса нет необходимых прав.
Удаление файла с помощью os.remove()
import os
os.remove("report.txt")Оберните вызов в блок try/except, чтобы программа корректно обрабатывала отсутствующие файлы:
Удаление файла с обработкой ошибок
import os
try:
os.remove("report.txt")
print("File deleted.")
except FileNotFoundError:
print("File not found — nothing to delete.")
except PermissionError:
print("Permission denied.")Использование pathlib.Path.unlink() (Python 3.4+)
pathlib предоставляет объектно-ориентированный интерфейс для работы с путями файловой системы. Path.unlink() удаляет файл, на который указывает путь. Начиная с Python 3.8, можно передать missing_ok=True, чтобы автоматически подавить FileNotFoundError.
Удаление файла с помощью pathlib
from pathlib import Path
# Raises FileNotFoundError if the file does not exist
Path("report.txt").unlink()Удаление файла без ошибки, если он не существует (Python 3.8+)
from pathlib import Path
Path("report.txt").unlink(missing_ok=True)
print("Done — file deleted or was already absent.")missing_ok=True — идиоматическая альтернатива для Python 3.8+ шаблону «проверить, затем удалить». Предпочтительнее проверок через os.path.exists(), поскольку позволяет избежать состояния гонки: другой процесс может удалить файл в промежутке между проверкой и удалением.
Проверка существования перед удалением (классический шаблон)
До появления missing_ok стандартным подходом была защитная проверка через os.path.exists():
Проверка существования перед удалением
import os
if os.path.exists("report.txt"):
os.remove("report.txt")
else:
print("File not found.")Для скриптов, где состояние гонки не имеет значения, этот способ вполне подходит, однако в новом коде предпочтительнее использовать missing_ok=True.
Удаление пустой директории
os.rmdir() удаляет директорию, но только если она пуста. При наличии файлов или поддиректорий внутри функция вызывает OSError.
Удаление пустой директории
import os
try:
os.rmdir("empty_folder")
print("Directory removed.")
except FileNotFoundError:
print("Directory not found.")
except OSError:
print("Directory is not empty or cannot be removed.")В pathlib используйте Path.rmdir():
from pathlib import Path
Path("empty_folder").rmdir()Удаление непустой директории
Для удаления директории вместе со всем её содержимым (файлами, поддиректориями и их содержимым) используйте shutil.rmtree(). Это аналог rm -rf в Unix — операция постоянная и необратимая.
Удаление дерева директорий
import shutil
shutil.rmtree("old_project")
print("Directory and all its contents deleted.")Добавьте обработку ошибок для типичных сбоев:
Безопасное удаление дерева директорий
import shutil
try:
shutil.rmtree("old_project")
print("Deleted successfully.")
except FileNotFoundError:
print("Directory not found.")
except PermissionError:
print("Permission denied.")Параметр ignore_errors
Передайте ignore_errors=True, чтобы молча подавить все ошибки. Используйте это только тогда, когда вам действительно не важно, выполнилось ли удаление успешно:
import shutil
shutil.rmtree("old_project", ignore_errors=True)Удаление нескольких файлов по шаблону
Для удаления всех файлов, соответствующих glob-шаблону, объедините pathlib.Path.glob() с unlink():
Удаление всех файлов .log в директории
from pathlib import Path
deleted = 0
for log_file in Path(".").glob("*.log"):
log_file.unlink()
deleted += 1
print(f"{deleted} log file(s) deleted.")Для рекурсивного поиска в поддиректориях используйте rglob():
Удаление всех файлов .tmp в дереве директорий
from pathlib import Path
for tmp_file in Path(".").rglob("*.tmp"):
tmp_file.unlink(missing_ok=True)Эквивалент на модуле os использует os.listdir() и os.remove():
Удаление всех файлов .txt с помощью os
import os
directory = "."
for filename in os.listdir(directory):
if filename.endswith(".txt"):
os.remove(os.path.join(directory, filename))Перед массовым удалением всегда проверяйте, какие файлы попадают под шаблон. Безопасная привычка — добавить print() перед циклом удаления.
Перемещение файлов в корзину (обратимое удаление)
os.remove() и Path.unlink() удаляют файлы безвозвратно — отмена невозможна. Если нужно обратимое удаление (перемещение файла в системную корзину), установите сторонний пакет send2trash:
pip install send2trashimport send2trash
send2trash.send2trash("report.txt")
print("File moved to Trash.")Это удобно в настольных инструментах или скриптах, где случайное удаление может быть критическим.
Сравнение методов удаления
| Метод | Цель | Непустая директория? | Примечания |
|---|---|---|---|
os.remove(path) | Один файл | — | Классический, широко поддерживается |
Path.unlink(missing_ok=True) | Один файл | — | Современный, защита от состояния гонки |
os.rmdir(path) | Пустая директория | Нет | Вызывает OSError, если не пустая |
Path.rmdir() | Пустая директория | Нет | Эквивалент в pathlib |
shutil.rmtree(path) | Дерево директорий | Да | Постоянное — использовать осторожно |
send2trash.send2trash(path) | Файл или папка | Да | Обратимое; требует установки |
Ключевые выводы
- Используйте
Path.unlink(missing_ok=True)для удаления одного файла в современном Python (3.8+). - Используйте
os.rmdir()илиPath.rmdir()только для пустых директорий. - Используйте
shutil.rmtree()для удаления директории вместе со всем содержимым — заранее проверьте путь. - Всегда обрабатывайте
FileNotFoundErrorиPermissionError, чтобы сделать скрипты устойчивыми. - Предпочитайте
send2trash, когда важна возможность отмены удаления.
Связанные главы
- Работа с файлами в Python — открытие, режимы и оператор
with - Чтение файлов в Python — чтение данных из файлов
- Запись и создание файлов в Python — запись и создание файлов
- Try Except в Python — надёжная обработка исключений