Как удалить содержимое папки?
Заголовок: Как удалить содержимое локальной папки в Python?
Здравствуйте!
У меня есть задача в текущем проекте на Windows, но было бы неплохо увидеть решение и для *nix систем. Я пытаюсь удалить все файлы и папки в определенной локальной папке с помощью Python, но не знаю, как это реализовать.
Как можно безопасно и эффективно удалить все содержимое указанного каталога? Буду признателен за любые примеры кода или указания на используемые библиотеки!
Спасибо!
5 ответ(ов)
Конечно! Вот перевод вашего кода на русский язык в формате, который может быть использован в ответе на вопрос на 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'
на фактический путь к вашей папке.
Вы можете сделать это следующим образом:
import os
import glob
files = glob.glob('/ВАШ/ПУТЬ/*')
for f in files:
os.remove(f)
Вы также можете использовать другой фильтр в вашем пути, например: /ВАШ/ПУТЬ/*.txt
, чтобы удалить все текстовые файлы в директории.
В дополнение к ответу 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'
на путь к вашей папке. Этот код рекурсивно проходит по всем файлам и папкам в указанной директории и удаляет их.
Использование 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)
Этот подход корректно обрабатывает файлы и папки, предотвращая ошибки при попытке удалить несуществующие или непустые директории.
Этот код:
- Удаляет все символические ссылки:
- мертвые ссылки
- ссылки на директории
- ссылки на файлы
- Удаляет поддиректории
- Не удаляет родительскую директорию
Код:
for filename in os.listdir(dirpath):
filepath = os.path.join(dirpath, filename)
try:
shutil.rmtree(filepath)
except OSError:
os.remove(filepath)
Как и многие другие ответы, этот код не пытается изменить права доступа, чтобы обеспечить удаление файлов/директорий.
Как читать файл построчно в список?
Как получить даты/времена создания и изменения файла?
Как удалить не пустую папку?
Сохранение списка в файл с помощью Python с учетом переносов строк
Конфигурация логгера для записи в файл и вывода на stdout