Как я могу удалить содержимое локальной папки в Python?
Текущий проект для Windows, но я также хотел бы видеть * nix.
Как я могу удалить содержимое локальной папки в Python?
Текущий проект для Windows, но я также хотел бы видеть * nix.
 Обновлен только для удаления файлов и использования 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)
Попробуй модуль шутил
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() не просто удаляет содержимое целевой папки. Также удаляет саму папку.
Вы можете просто сделать это:
import os
import glob
files = glob.glob('/YOUR/PATH/*')
for f in files:
    os.remove(f)
Конечно, вы можете использовать другой фильтр в вашем пути, например: /YOU/PATH/*.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))
Использование 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)
Это единственный ответ, который:
код:
for filename in os.listdir(dirpath):
    filepath = os.path.join(dirpath, filename)
    try:
        shutil.rmtree(filepath)
    except OSError:
        os.remove(filepath)
Как и многие другие ответы, это не пытается настроить разрешения для удаления файлов/каталогов.
В качестве 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)) )
Примечания: в случае, если кто-то проголосовал за мой ответ, мне есть, что объяснить здесь.
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")
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)
Вам может быть полезно использовать os.walk() для этого.
 os.listdir() не отличает файлы от каталогов, и вы быстро столкнетесь с проблемой, пытаясь отменить их. Существует хороший пример использования os.walk() для рекурсивного удаления каталога здесь и подсказки о том, как его адаптировать к вашим обстоятельствам.
Я использовал проблему таким образом:
import shutil
import os
shutil.rmtree(dirpath)
os.mkdir(dirpath)
Я написал эту ветку, но я нашел что-то интересное с официального сайта 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))
Еще одно решение:
import sh
sh.rm(sh.glob('/path/to/folder/*'))
 Я удивлен, что никто не упомянул об удивительном 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)
Если вы используете систему * nix, почему бы не использовать системную команду?
import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
Довольно интуитивный способ сделать это:
import shutil, os
def remove_folder_contents(path):
    shutil.rmtree(path)
    os.makedirs(path)
remove_folder_contents('/path/to/folder')
 Я решил проблему с rmtree makedirs, добавив time.sleep() между:
if os.path.isdir(folder_location):
    shutil.rmtree(folder_location)
time.sleep(.5)
os.makedirs(folder_location, 0o777)
Просто сделай это. Это удалит все файлы внутри каталога, а также из подкаталогов. Без вреда для любой папки/каталога. Хорошо работает на 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))
Ответ на ограниченную конкретную ситуацию: предполагая, что вы хотите удалить файлы при сохранении дерева подпапок, вы можете использовать рекурсивный алгоритм:
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)
Возможно, немного не по теме, но я думаю, что многие сочтут это полезным.
 Предполагая, что temp_dir будет удален, однострочная команда, использующая os:
_ = [os.remove(os.path.join(save_dir,i)) for i in os.listdir(temp_dir)]
Примечание. Это всего лишь 1 строка для удаления файлов "Не удаляет каталоги.
Надеюсь это поможет. Благодарю.
Используйте метод ниже, чтобы удалить содержимое каталога, а не сам каталог:
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)
самый простой способ удалить все файлы в папке/удалить все файлы
import os
files = os.listdir(yourFilePath)
for f in files:
    os.remove(yourFilePath + f)
Это должно сделать трюк, просто используя модуль ОС, чтобы его просмотреть, а затем удалить!
import os
DIR = os.list('Folder')
for i in range(len(DIR)):
    os.remove('Folder'+chr(92)+i)
Работал для меня, любые проблемы дайте мне знать!