Как с помощью модуля `shutil` удалить директорию и её содержимое?

Используйте функцию shutil.rmtree(path). Она рекурсивно удалит директорию, включая все файлы и поддиректории. Будьте осторожны, так как это необратимая операция!

Модуль shutil в Python предоставляет функцию shutil.rmtree() для рекурсивного удаления директории и всего её содержимого (файлов, поддиректорий и т.д.). Это эквивалентно команде rm -rf в Unix-подобных системах.

Синтаксис:

shutil.rmtree(path, ignore_errors=False, onerror=None)

Параметры:

  • path: Путь к директории, которую нужно удалить. Это должна быть строка, представляющая путь к существующей директории.
  • ignore_errors (необязательный): Если True, ошибки, возникающие во время удаления, будут игнорироваться. По умолчанию False, и в этом случае, если возникнет ошибка, будет вызвано исключение.
  • onerror (необязательный): Функция обратного вызова, которая будет вызываться, если произошла ошибка при удалении. Она должна принимать три аргумента: func (функция, которая вызвала ошибку, например, os.remove), path (путь к файлу или директории, вызвавшей ошибку), и excinfo (информация об исключении, возвращаемая sys.exc_info()). Функция onerror должна обработать ошибку и вернуть управление. Если она не обрабатывает ошибку, то исключение будет перехвачено и shutil.rmtree() попытается продолжить работу. Если ignore_errors равно False и onerror не задан, возникшее исключение будет перехвачено и перевыброшено.

Пример использования:


import shutil
import os

# Пример: Удаление директории с обработкой ошибок

def handle_remove_read_only(func, path, exc):
  """
  Обработчик ошибок для shutil.rmtree.
  Пытается изменить права доступа к файлу и повторить попытку удаления.
  """
  excvalue = exc[1]
  if func in (os.rmdir, os.remove, os.unlink) and excvalue.errno == errno.EACCES:
    os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)  # 0777
    func(path)
  else:
    raise

# 1. Создадим тестовую директорию и файлы (только для примера)
test_dir = "test_dir"
os.makedirs(test_dir, exist_ok=True)
with open(os.path.join(test_dir, "test_file.txt"), "w") as f:
  f.write("Hello, world!")


# 2. Удаление директории с использованием shutil.rmtree
try:
  shutil.rmtree(test_dir, onerror=handle_remove_read_only) # используем обработчик для проблем с правами
  print(f"Директория '{test_dir}' успешно удалена.")
except OSError as e:
  print(f"Ошибка при удалении директории '{test_dir}': {e}")


# Альтернативный пример с ignore_errors=True
# try:
#   shutil.rmtree("non_existent_dir", ignore_errors=True)
#   print("Попытка удаления несуществующей директории прошла без ошибок (ignore_errors=True)")
# except Exception as e:
#   print(f"Произошла ошибка: {e}")


  

Важно:

  • shutil.rmtree() удаляет директорию безвозвратно. Будьте очень осторожны при её использовании, чтобы не удалить важные данные.
  • Перед использованием shutil.rmtree() рекомендуется убедиться, что у вас есть права на удаление директории и её содержимого.
  • В некоторых случаях (например, если файлы в директории защищены от записи), удаление может завершиться неудачно. В таких ситуациях можно использовать параметр onerror для обработки ошибок. Пример обработки проблем с правами доступа представлен в коде выше.
  • Если вам нужно просто очистить директорию, но не удалять её, можно использовать os.listdir() и os.remove()/shutil.rmtree() в цикле, чтобы удалить все файлы и поддиректории, но оставить саму директорию нетронутой.
0