8

Как удалить содержимое папки?

1

Заголовок: Как удалить содержимое локальной папки в Python?

Здравствуйте!

У меня есть задача в текущем проекте на Windows, но было бы неплохо увидеть решение и для *nix систем. Я пытаюсь удалить все файлы и папки в определенной локальной папке с помощью Python, но не знаю, как это реализовать.

Как можно безопасно и эффективно удалить все содержимое указанного каталога? Буду признателен за любые примеры кода или указания на используемые библиотеки!

Спасибо!

5 ответ(ов)

7

Конечно! Вот перевод вашего кода на русский язык в формате, который может быть использован в ответе на вопрос на StackOverflow:

import os
import shutil

# Укажите путь к папке
folder = '/path/to/folder'

# Проходим по всем элементам в папке
for filename in os.listdir(folder):
    file_path = os.path.join(folder, filename)  # Получаем полный путь к файлу
    try:
        # Если это файл или символическая ссылка, удаляем
        if os.path.isfile(file_path) or os.path.islink(file_path):
            os.unlink(file_path)
        # Если это директория, удаляем её полностью
        elif os.path.isdir(file_path):
            shutil.rmtree(file_path)
    except Exception as e:
        # В случае ошибки выводим сообщение
        print('Не удалось удалить %s. Причина: %s' % (file_path, e))

Этот код позволяет удалить все файлы и папки внутри указанной директории. Обратите внимание на обработку исключений: если возникнет ошибка при удалении элемента, программа отобразит сообщение с причиной ошибки. Не забудьте заменить '/path/to/folder' на фактический путь к вашей папке.

5

Вы можете сделать это следующим образом:

import os
import glob

files = glob.glob('/ВАШ/ПУТЬ/*')
for f in files:
    os.remove(f)

Вы также можете использовать другой фильтр в вашем пути, например: /ВАШ/ПУТЬ/*.txt, чтобы удалить все текстовые файлы в директории.

1

В дополнение к ответу mhawke, вот что я реализовал. Этот код удаляет все содержимое папки, но не саму папку. Я протестировал его на Linux с файлами, папками и символическими ссылками, также он должен работать и на Windows.

import os
import shutil

for root, dirs, files in os.walk('/path/to/folder'):
    for f in files:
        os.unlink(os.path.join(root, f))
    for d in dirs:
        shutil.rmtree(os.path.join(root, d))

Обратите внимание, что вам нужно заменить '/path/to/folder' на путь к вашей папке. Этот код рекурсивно проходит по всем файлам и папкам в указанной директории и удаляет их.

0

Использование rmtree и последующее создание папки может сработать, но я сталкивался с ошибками при удалении и немедленном создании папок на сетевых дисках.

Предложенное решение с использованием walk не работает, поскольку оно использует rmtree для удаления папок, а затем может попытаться применить os.unlink к файлам, которые ранее находились в этих папках. Это приводит к ошибке.

Предложенное решение с glob также попытается удалить непустые папки, что вызовет ошибки.

Я предлагаю использовать следующий код:

folder_path = '/path/to/folder'
for file_object in os.listdir(folder_path):
    file_object_path = os.path.join(folder_path, file_object)
    if os.path.isfile(file_object_path) or os.path.islink(file_object_path):
        os.unlink(file_object_path)
    else:
        shutil.rmtree(file_object_path)

Этот подход корректно обрабатывает файлы и папки, предотвращая ошибки при попытке удалить несуществующие или непустые директории.

0

Этот код:

  • Удаляет все символические ссылки:
    • мертвые ссылки
    • ссылки на директории
    • ссылки на файлы
  • Удаляет поддиректории
  • Не удаляет родительскую директорию

Код:

for filename in os.listdir(dirpath):
    filepath = os.path.join(dirpath, filename)
    try:
        shutil.rmtree(filepath)
    except OSError:
        os.remove(filepath)

Как и многие другие ответы, этот код не пытается изменить права доступа, чтобы обеспечить удаление файлов/директорий.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь