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

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

Текущий проект для Windows, но я также хотел бы видеть * nix.

Ответы

Ответ 1

Обновлен только для удаления файлов и использования os.path.join() предложенного в комментариях. Если вы также хотите удалить подкаталоги, раскомментируйте оператор elif.

import os, shutil
folder = '/path/to/folder'
for the_file in os.listdir(folder):
    file_path = os.path.join(folder, the_file)
    try:
        if os.path.isfile(file_path):
            os.unlink(file_path)
        #elif os.path.isdir(file_path): shutil.rmtree(file_path)
    except Exception as e:
        print(e)

Ответ 2

Попробуй модуль шутил

import shutil
shutil.rmtree('/path/to/folder')

Описание: shutil.rmtree(path, ignore_errors=False, onerror=None)

Docstring: рекурсивно удалить дерево каталогов.

Если установлено ignore_errors, ошибки игнорируются; в противном случае, если установлено значение onerror, оно вызывается для обработки ошибки с аргументами (func, path, exc_info) где func - это os.listdir, os.remove или os.rmdir; путь - это аргумент этой функции, который вызвал ее сбой; и exc_info - это кортеж, возвращаемый sys.exc_info(). Если ignore_errors - false, а onerror - None, возникает исключение.

Важное примечание: shutil.rmtree() что shutil.rmtree() не просто удаляет содержимое целевой папки. Также удаляет саму папку.

Ответ 3

Вы можете просто сделать это:

import os
import glob

files = glob.glob('/YOUR/PATH/*')
for f in files:
    os.remove(f)

Конечно, вы можете использовать другой фильтр в вашем пути, например: /YOU/PATH/*.txt для удаления всех текстовых файлов в каталоге.

Ответ 4

Развернувшись на 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))

Ответ 5

Использование 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):
        os.unlink(file_object_path)
    else:
        shutil.rmtree(file_object_path)

Ответ 6

Это единственный ответ, который:

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

код:

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

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

Ответ 7

В качестве oneliner:

import os

# Python 2.7
map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) )

# Python 3+
list( map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) )

Более надежное решение, учитывающее файлы и каталоги, также будет (2.7):

def rm(f):
    if os.path.isdir(f): return os.rmdir(f)
    if os.path.isfile(f): return os.unlink(f)
    raise TypeError, 'must be either file or directory'

map( rm, (os.path.join( mydir,f) for f in os.listdir(mydir)) )

Ответ 8

Примечания: в случае, если кто-то проголосовал за мой ответ, мне есть, что объяснить здесь.

  • Все любят короткие "n" простые ответы. Однако иногда реальность не так проста.
  • Вернуться к моему ответу. Я знаю, что shutil.rmtree() может использоваться для удаления дерева каталогов. Я использовал его много раз в своих проектах. Но вы должны понимать, что сам каталог также будет удален shutil.rmtree(). Хотя это может быть приемлемым для некоторых, это не правильный ответ для удаления содержимого папки (без побочных эффектов).
  • Я покажу вам пример побочных эффектов. Предположим, что у вас есть каталог с настроенным владельцем и битами режима, где есть много контента. Затем вы удалите его с помощью shutil.rmtree() и перестройте его с помощью os.mkdir(). И вы получите пустой каталог с стандартным (унаследованным) владельцем и битами режима. В то время как у вас может быть привилегия для удаления содержимого и даже каталога, вы не сможете установить исходный бит владельца и режима в каталоге (например, вы не являетесь суперпользователем).
  • Наконец, будьте терпеливы и прочитайте код. Он длинный и уродливый (в поле зрения), но зарекомендовал себя как надежный и эффективный (в использовании).

Здесь длинное и уродливое, но надежное и эффективное решение.

Он решает несколько проблем, которые не рассматриваются другими респондентами:

  • Он правильно обрабатывает символические ссылки, в том числе не вызывая shutil.rmtree() по символической ссылке (которая пройдет тест os.path.isdir(), если он ссылается на каталог, даже результат os.walk() содержит также символические связанные каталоги).
  • Он отлично обрабатывает файлы только для чтения.

Здесь код (единственная полезная функция - clear_dir()):

import os
import stat
import shutil


# http://stackoverflow.com/questions/1889597/deleting-directory-in-python
def _remove_readonly(fn, path_, excinfo):
    # Handle read-only files and directories
    if fn is os.rmdir:
        os.chmod(path_, stat.S_IWRITE)
        os.rmdir(path_)
    elif fn is os.remove:
        os.lchmod(path_, stat.S_IWRITE)
        os.remove(path_)


def force_remove_file_or_symlink(path_):
    try:
        os.remove(path_)
    except OSError:
        os.lchmod(path_, stat.S_IWRITE)
        os.remove(path_)


# Code from shutil.rmtree()
def is_regular_dir(path_):
    try:
        mode = os.lstat(path_).st_mode
    except os.error:
        mode = 0
    return stat.S_ISDIR(mode)


def clear_dir(path_):
    if is_regular_dir(path_):
        # Given path is a directory, clear its content
        for name in os.listdir(path_):
            fullpath = os.path.join(path_, name)
            if is_regular_dir(fullpath):
                shutil.rmtree(fullpath, onerror=_remove_readonly)
            else:
                force_remove_file_or_symlink(fullpath)
    else:
        # Given path is a file or a symlink.
        # Raise an exception here to avoid accidentally clearing the content
        # of a symbolic linked directory.
        raise OSError("Cannot call clear_dir() on a symbolic link")

Ответ 9

import os
import shutil

# Gather directory contents
contents = [os.path.join(target_dir, i) for i in os.listdir(target_dir)]

# Iterate and remove each item in the appropriate manner
[os.remove(i) if os.path.isfile(i) or os.path.islink(i) else shutil.rmtree(i) for i in contents]

В более раннем комментарии также упоминается использование os.scandir в Python 3.5+. Например:

import os
import shutil

with os.scandir(target_dir) as entries:
    for entry in entries:
        if entry.is_file() or entry.is_symlink():
            os.remove(entry.path)
        elif entry.is_dir():
            shutil.rmtree(entry.path)

Ответ 10

Вам может быть полезно использовать os.walk() для этого.

os.listdir() не отличает файлы от каталогов, и вы быстро столкнетесь с проблемой, пытаясь отменить их. Существует хороший пример использования os.walk() для рекурсивного удаления каталога здесь и подсказки о том, как его адаптировать к вашим обстоятельствам.

Ответ 11

Я использовал проблему таким образом:

import shutil
import os

shutil.rmtree(dirpath)
os.mkdir(dirpath)

Ответ 12

Я написал эту ветку, но я нашел что-то интересное с официального сайта python. Просто для обмена другой идеей удаления всего содержимого в каталоге. Поскольку у меня есть некоторые проблемы с авторизацией при использовании shutil.rmtree(), и я не хочу удалять каталог и воссоздавать его. Исходный адрес http://docs.python.org/2/library/os.html#os.walk. Надеюсь, что это поможет кому-то.

def emptydir(top):
    if(top == '/' or top == "\\"): return
    else:
        for root, dirs, files in os.walk(top, topdown=False):
            for name in files:
                os.remove(os.path.join(root, name))
            for name in dirs:
                os.rmdir(os.path.join(root, name))

Ответ 13

Еще одно решение:

import sh
sh.rm(sh.glob('/path/to/folder/*'))

Ответ 14

Я удивлен, что никто не упомянул об удивительном pathlib к этой работе.

Если вы хотите удалить только файлы в каталоге, это может быть oneliner

from pathlib import Path

[f.unlink() for f in Path("/path/to/folder").glob("*") if f.is_file()] 

Также для рекурсивного удаления каталогов вы можете написать что-то вроде этого:

from pathlib import Path
from shutil import rmtree

for path in Path("/path/to/folder").glob("**/*"):
    if path.is_file():
        path.unlink()
    elif path.is_dir():
        rmtree(path)

Ответ 15

Если вы используете систему * nix, почему бы не использовать системную команду?

import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)

Ответ 16

Довольно интуитивный способ сделать это:

import shutil, os


def remove_folder_contents(path):
    shutil.rmtree(path)
    os.makedirs(path)


remove_folder_contents('/path/to/folder')

Ответ 17

Я решил проблему с rmtree makedirs, добавив time.sleep() между:

if os.path.isdir(folder_location):
    shutil.rmtree(folder_location)

time.sleep(.5)

os.makedirs(folder_location, 0o777)

Ответ 18

Просто сделай это. Это удалит все файлы внутри каталога, а также из подкаталогов. Без вреда для любой папки/каталога. Хорошо работает на Ubuntu без каких-либо ошибок.

import os
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath):
    for file in files:
        os.remove(os.path.join(root, file))

Ответ 19

Ответ на ограниченную конкретную ситуацию: предполагая, что вы хотите удалить файлы при сохранении дерева подпапок, вы можете использовать рекурсивный алгоритм:

import os

def recursively_remove_files(f):
    if os.path.isfile(f):
        os.unlink(f)
    elif os.path.isdir(f):
        map(recursively_remove_files, [os.path.join(f,fi) for fi in os.listdir(f)])

recursively_remove_files(my_directory)

Возможно, немного не по теме, но я думаю, что многие сочтут это полезным.

Ответ 20

Предполагая, что temp_dir будет удален, однострочная команда, использующая os:

_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]

Примечание. Это всего лишь 1 строка для удаления файлов "Не удаляет каталоги.

Надеюсь это поможет. Благодарю.

Ответ 21

Используйте метод ниже, чтобы удалить содержимое каталога, а не сам каталог:

import os
import shutil

def remove_contents(path):
    for c in os.listdir(path):
        full_path = os.path.join(path, c)
        if os.path.isfile(full_path):
            os.remove(full_path)
        else:
            shutil.rmtree(full_path)

Ответ 22

самый простой способ удалить все файлы в папке/удалить все файлы

import os
files = os.listdir(yourFilePath)
for f in files:
    os.remove(yourFilePath + f)

Ответ 23

Это должно сделать трюк, просто используя модуль ОС, чтобы его просмотреть, а затем удалить!

import os
DIR = os.list('Folder')
for i in range(len(DIR)):
    os.remove('Folder'+chr(92)+i)

Работал для меня, любые проблемы дайте мне знать!