W3docs

Удаление файлов и директорий в 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.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 send2trash
import 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, когда важна возможность отмены удаления.

Связанные главы

Was this page helpful?