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

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

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


person UnkwnTech    schedule 09.10.2008    source источник
comment
для * nix, если честно, я бы просто использовал os.system('rm -rf folder')   -  person Tilak Maddy    schedule 23.11.2019


Ответы (25)


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

import os
import glob

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

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

person Blueicefield    schedule 22.04.2011
comment
@Blueicefield * не будет отображать скрытые файлы, мы также должны добавить glob.glob('path/.*) - person satoru; 01.11.2013
comment
хотя удалить список файлов мне кажется проще: import sh; sh.rm(files) - person Robin Winslow; 12.05.2014
comment
Хотя import sh; sh.rm(files) действительно выглядит красивее, вы столкнетесь с проблемами, если в каталоге более 1024 файлов. - person Eugene; 01.11.2019
comment
@satoru, как бы вы добавили это другое объединение скрытых файлов? - person Timo; 25.12.2020
comment
@satoru для расширения на другие типы файлов с помощью glob, можно использовать extend (). - person Timo; 25.12.2020
comment
Выдает исключение для подкаталогов - person Kiruahxh; 11.05.2021

Вы можете удалить саму папку, а также все ее содержимое, используя _1 _:

import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)


Удалить все дерево каталогов; путь должен указывать на каталог (но не на символическую ссылку на каталог). Если ignore_errors истинно, ошибки, возникающие в результате неудачного удаления, будут игнорироваться; если false или опущено, такие ошибки обрабатываются путем вызова обработчика, указанного в onerror, или, если он опущен, они вызывают исключение.

person Oli    schedule 09.10.2008
comment
Это приведет к удалению не только содержимого, но и самой папки. Я не думаю, что вопрос задает вопрос. - person Iker Jimenez; 01.07.2009
comment
Думаю, это хороший ответ. Почему бы вам просто не удалить содержимое и папку, а затем переделать папку? - person cssndrx; 07.07.2011
comment
Потому что новый каталог и старый не будут одинаковыми. Так что, если программа сидит в каталоге, ожидая чего-то, ей придется вытащить коврик из-под нее. - person Mike Cooper; 26.11.2011
comment
Также обратите внимание, что если где-то в дереве папок есть один файл, который нельзя удалить, ничего не удаляется. - person James; 18.02.2013
comment
Просто воссоздайте каталог после rmtree. Как 2_ - person Iulius Curt; 14.06.2013
comment
@IuliusCurt нет, у меня есть каталог, смонтированный в оперативной памяти, который мне нужно очистить, и, к сожалению, я не могу просто удалить, а затем воссоздать его: OSError: [Errno 16] Device or resource busy - person Arnaud P; 13.12.2018
comment
Вы должны отметить, что воссоздание папки не обязательно одно и то же, например, если вы монтируете папку в докере и удаляете папку, воссоздание папки внутри докера не приведет к воссозданию смонтированной папки. - person ethanjyx; 13.09.2019
comment
Также учитывайте разрешения, модификации файлов в unix, права собственности и т. Д. Поэтому этот пример опасен. - person Saren Tasciyan; 31.03.2020
comment
плюс вы сбросите все метаданные (время создания, время последнего доступа и т. д.) - person Daniel Braun; 06.05.2020
comment
Даже если вас не интересуют метаданные и т. Д., В Windows может случайно возникнуть некоторая проблема синхронизации, когда, если вы выполните shutil.rmtree () сразу после os.makedirs (..., exist_ok = True), македир будет думать, что папка все еще существует, поэтому она не будет создавать папку. Однако после завершения вызова македиров папка будет удалена. Об этом упоминалось в stackoverflow.com/a/6615332/848627 относительно сетевых дисков, но я видел, как это происходило на нормальный диск тоже. - person drojf; 29.08.2020
comment
используя это, потому что os.remove() не работает, Mac работает на Big Sur - person cryanbhu; 10.12.2020

Расширяя ответ 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))
person Iker Jimenez    schedule 02.07.2009
comment
Почему «гулять», а не просто перечислять содержимое папки? - person Don; 18.01.2012
comment
Это правильный ответ, если вы также хотите удалить каталоги. walk используется для разделения каталогов и файлов, которые должны обрабатываться по-разному. Вы также можете использовать os.listdir, но вам придется вручную проверять, является ли каждая запись каталогом или файлом. - person dkamins; 16.03.2012
comment
Это близко, но и os.walk, и shutil.rmtree рекурсивны. os.walk не нужен, так как вам нужно очистить только файлы и каталоги на верхнем уровне внутри каталога. Просто используйте оператор if для элементов в os.listdir, чтобы узнать, является ли каждый из них файлом или каталогом. Затем используйте remove / unlink и rmtree соответственно. - person Matthew Alpert; 09.01.2014
comment
@MatthewAlpert Обратите внимание, однако, что os.walk здесь не будет рекурсивно, потому что он возвращает генератор, который рекурсивно просматривает подкаталоги только при попытке его продвижения, и к тому времени, когда вы выполните свою первую итерацию этого цикла, нет подкаталоги, оставленные для просмотра. По сути, os.walk здесь просто используется как альтернативный способ отличить папки верхнего уровня от файлов верхнего уровня; рекурсия не используется, и мы не платим за ее производительность. Однако это эксцентрично, и я согласен с тем, что предложенный вами подход лучше просто потому, что он более ясен и удобочитаем. - person Mark Amery; 23.11.2019

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

Предлагаемое решение с использованием обхода не работает, поскольку оно использует 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)
person jgoeders    schedule 07.07.2011
comment
Ваше решение также вызовет ошибку, если есть символическая ссылка на другой каталог. - person Blueicefield; 08.04.2013
comment
@Blueicefield - Вы можете привести пример. Я тестировал в Linux, используя файл и папку с символической ссылкой, и пока не смог вызвать ошибку. - person jgoeders; 12.03.2014
comment
@jgoeders - Если есть символическая ссылка на каталог, os.path.isfile() вернет False (потому что он следует по символическим ссылкам), и вы в конечном итоге вызовете shutil.rmtree() для символической ссылки, которая вызовет OSError("Cannot call rmtree on a symbolic link"). - person Rockallite; 19.07.2014
comment
@Rockallite исправлено проверкой на islink - person Kevin; 09.09.2014
comment
мое редактирование было отклонено, но я добавил if os.path.islink(file_object_path): os.unlink(file_object_path) и преобразовал if в else if. - person Kevin; 14.02.2019
comment
Предлагаемое решение с использованием walk не работает, поскольку оно использует rmtree для удаления папок, а затем может попытаться использовать os.unlink для файлов, которые ранее находились в этих папках - это не то, что я наблюдаю при использовании локального диска на моем Mac. Генератор, возвращенный из os.walk, просто не дает второй элемент, если вы удалили все папки на первой итерации. Я могу поверить, что есть какая-то файловая система или среда, для которых это верно (например, сетевой диск), но это определенно не универсальная правда. - person Mark Amery; 23.11.2019
comment
Также: @kevinf правильно указывает на необходимость islink проверки здесь для правильной обработки символических ссылок на каталоги. Я добавил такую ​​проверку к принятому ответу. - person Mark Amery; 23.11.2019

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

Если вы хотите удалить только файлы в каталоге, это может быть единственная инструкция.

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)
person Husky    schedule 15.05.2019
comment
.iterdir() вместо .glob(...) тоже должно работать. - person S. Kirby; 14.11.2019

Этот:

  • removes all symbolic links
    • dead links
    • ссылки на каталоги
    • ссылки на файлы
  • удаляет подкаталоги
  • не удаляет родительский каталог

Код:

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

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

person Jon Chu    schedule 21.09.2012

В качестве единственного лайнера:

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)) )
person fmonegaglia    schedule 24.11.2013
comment
для больших операций использование генератора может быть несколько более эффективным map( os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)) ) - person user25064; 18.09.2014
comment
на самом деле пытаясь использовать это, понял, что объект карты должен быть повторен, поэтому требуется вызов списка (или что-то, что будет повторяться), например list(map(os.unlink, (os.path.join( mydir,f) for f in os.listdir(mydir)))) - person user25064; 19.09.2014
comment
Первый включен в ответ, второй для меня не имеет смысла. Зачем вам перебирать функцию, отображаемую на итерацию? Карта делает это. - person fmonegaglia; 22.10.2015
comment
В Python3 вам нужно обернуть map в list, чтобы выполнить итерацию. См. http://stackoverflow.com/questions/1303347/getting-a-map-to-return-a-list-in-python-3-x - person paulwasit; 07.10.2016
comment
Это точно не сработает, если mydir содержит хотя бы одну папку, так как unlink работает только для файлов ... - person kupsef; 23.11.2016
comment
@kupsef ты прав. Я включил обходной путь в свой ответ - person fmonegaglia; 29.11.2016

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

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

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

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

  • Он правильно обрабатывает символические ссылки, в том числе не вызывает 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")
person Rockallite    schedule 19.07.2014
comment
Я не понимаю, в каком контексте имеет смысл менять режим файла. На моем Mac os.remove, в отличие от утилиты rm, с радостью удаляет файлы, доступные только для чтения, если они принадлежат вам. Между тем, если это файл, которым вы не владеете и к которому у вас есть доступ только для чтения, вы не можете удалить его или изменить его права доступа. Я не знаю ни одной ситуации, в которой вы не смогли бы удалить файл, доступный только для чтения, с os.remove, но при этом смогли бы изменить его разрешения. Кроме того, вы используете lchmod, которого нет ни на моем Mac, ни в Windows, согласно его документации. Для какой платформы предназначен этот код ?! - person Mark Amery; 23.11.2019

Использование протокола os.scandir и диспетчера контекста в Python 3.6+:

import os
import shutil

with os.scandir(target_dir) as entries:
    for entry in entries:
        if entry.is_dir() and not entry.is_symlink():
            shutil.rmtree(entry.path)
        else:
            os.remove(entry.path)

Более ранние версии Python:

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
[shutil.rmtree(i) if os.path.isdir(i) and not os.path.islink(i) else os.remove(i) for i in contents]
person Jacob Wan    schedule 02.12.2012
comment
os.path.isdir() не является правильным способом отличить обычный каталог от символической ссылки. Вызов shutil.rmtree() по символической ссылке вызовет OSError исключение. - person Rockallite; 20.07.2014
comment
@Rockallite Спасибо. Ты прав. Я обновил пример. - person Jacob Wan; 08.02.2017
comment
Вам не нужно is_file(): по крайней мере, в Unix основной системный вызов для удаления специальных файлов такой же, как и для обычных файлов - отменить связь. Только настоящие каталоги нуждаются в рекурсивной обработке, т.е. is_dir() and not is_symlink() (чтобы правильно обрабатывать символические ссылки на каталоги, как вы это уже делаете). - person user2394284; 26.05.2021
comment
Спасибо, @ user2394284. Я обновил пример на основе ваших отзывов. - person Jacob Wan; 24.06.2021

Раньше я решал проблему так:

import shutil
import os

shutil.rmtree(dirpath)
os.mkdir(dirpath)
person ProfHase85    schedule 17.06.2013
comment
Его семантика радикально отличается от того, что задается в вопросе, и его не следует рассматривать как верный ответ. - person fatuhoku; 26.09.2013
comment
Не понимаю вашего комментария: ›Как я могу удалить содержимое локальной папки в Python. Текущий проект предназначен для Windows, но я бы тоже хотел увидеть * nix. вот в чем вопрос. Ответ решает задачу. - person ProfHase85; 26.09.2013
comment
С уважением, я думаю, что удаление содержимого локальной папки не требует удаления самой папки. Та же проблема, что и в этом ответе, за исключением того, что он получил много голосов! - person fatuhoku; 26.09.2013
comment
Это все равно, что ответить на вопрос: как сделать так, чтобы функция возвращала число 1 в Python? с def return_a_one (): launch_some_nukes () return 1 - person fatuhoku; 26.09.2013
comment
Конечно, семантика иная: но вы также можете рассматривать это как еще один способ взглянуть на проблему. Это решение прекрасно, поскольку оно решает проблему. Есть отличие от вашего примера «launch_some_nukes»: 1. Решение короче и проще, чем принятое, и в отличие от приведенного вами ответа оно действительно. 2. Эквивалент 'launch_some_nukes' в этом случае - это удаление и воссоздание папки. Разница между старой и новой папкой - только номер inode (вероятно, не имеет отношения к OP) - person ProfHase85; 31.10.2013
comment
Я бы сказал, что это больше похоже на типичный физический вопрос: узнать высоту небоскреба с помощью барометра: ожидаемое решение - измерить атмосферное давление внизу и вверху и рассчитать разницу в высоте по барометрической формуле Другое Решением было бы пойти к дворнику и дать ему барометр в обмен на то, что он скажет вам высоту небоскреба. - person ProfHase85; 31.10.2013
comment
Ни то, ни другое не предполагает сноса небоскреба и последующего восстановления небоскреба любой высоты по вашему выбору. - person fatuhoku; 31.10.2013
comment
Это скорее снос небоскреба и восстановление точно такого же размера;) - person ProfHase85; 31.10.2013
comment
Я действительно использовал это решение - и оно работает. Из плюсов - это просто, из минусов - есть крайние случаи. Удаление каталога не удастся (по крайней мере, в Windows), если в этом каталоге открыта оболочка - удаление файлов НЕ приведет к этому. Также: при использовании относительных имен для каталога, таких как temp, 'rmtree' будет работать, но 'os.mkdir' не сработает (если вы не используете ./temp). - person monojohnny; 07.10.2015
comment
Блестящая идея, но есть проблема, иногда она может не работать: stackoverflow.com/questions/16373747/ - person Black Thunder; 13.10.2019
comment
как вы сохраняете привилегии пользователей папки? - person obayhan; 15.10.2020
comment
Что ж, в зависимости от ситуации это работает очень хорошо @fatuhoku, например, в моем случае я пытаюсь сделать то, что ставится под сомнение, но в зависимости от моей программы я бы подумал, если удаление и повторное создание каталога вызовет некоторые проблемы (that's on me), но это действительно так нет .. так что этот ответ все еще в порядке! Зависит от того, кто читает это в Интернете, и как они думают, что этот ответ повлияет на их программу. - person Ice Bear; 17.12.2020

Чтобы удалить все файлы внутри каталога, а также его подкаталоги, не удаляя сами папки, просто сделайте следующее:

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))
person Kevin Patel    schedule 26.02.2019

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

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

person mhawke    schedule 09.10.2008

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

import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
person silverbullettt    schedule 12.06.2018
comment
Поскольку, как указано в вопросе, текущий проект предназначен для Windows - person sox with Monica; 31.01.2019
comment
@soxwithMonica нельзя адаптировать эту команду для синтаксиса терминала Windows? - person Jivan; 15.06.2020
comment
@Jivan уверен, что может. - person sox with Monica; 15.06.2020
comment
Ой. Опасно запускать с -rf. Если есть ошибка в пути ... может закончиться удалением важных файлов. - person GeneCode; 08.03.2021
comment
os.system + обработка строки + неправильное цитирование = внедрение оболочки - person user2394284; 26.05.2021

Мне пришлось удалить файлы из 3 отдельных папок внутри единственного родительского каталога:

directory
   folderA
      file1
   folderB
      file2
   folderC
      file3

Этот простой код помог мне: (Я использую Unix)

import os
import glob

folders = glob.glob('./path/to/parentdir/*')
for fo in folders:
  file = glob.glob(f'{fo}/*')
  for f in file:
    os.remove(f)

Надеюсь это поможет.

person NicoBar    schedule 11.01.2020

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

import sh
sh.rm(sh.glob('/path/to/folder/*'))
person Robin Winslow    schedule 12.05.2014
comment
Обратите внимание, что sh не входит в стандартную библиотеку и требует установки из PyPI, прежде чем вы сможете ее использовать. Кроме того, поскольку это фактически вызывает rm в подпроцессе, он не будет работать в Windows, где rm не существует. Это также вызовет исключение, если папка содержит какие-либо подкаталоги. - person Mark Amery; 23.11.2019

Я знаю, что это старая ветка, но я нашел кое-что интересное на официальном сайте 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))
person Sawyer    schedule 02.05.2013

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

import shutil, os


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


remove_folder_contents('/path/to/folder')
person Manrique    schedule 26.07.2019

Что ж, я думаю, что этот код работает. Он не удалит папку, и вы можете использовать этот код для удаления файлов с определенным расширением.

import os
import glob

files = glob.glob(r'path/*')
for items in files:
    os.remove(items)
person Kush Modi    schedule 04.11.2019

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

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

time.sleep(.5)

os.makedirs(folder_location, 0o777)
person physlexic    schedule 21.03.2017

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

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)
person amirz98    schedule 03.02.2019
comment
@FabioSpaghetti Negative - person amirz98; 01.03.2019
comment
спасибо, Амир, я ищу решение, которое находит определенную папку во всех подкаталогах корневого каталога и удаляет содержимое этой папки - person FabioSpaghetti; 01.03.2019
comment
Это не добавляет ничего нового, чего не было в принятом ответе за несколько лет до того, как вы его опубликовали. - person Mark Amery; 23.11.2019

Чтобы удалить все файлы в папке, я использую:

import os
for i in os.listdir():
    os.remove(i)
person andrec    schedule 12.05.2021
comment
Просто подчеркну, что это будет работать только в том случае, если данный каталог содержит только файлы. Если каталог содержит другой каталог, будет возбуждено исключение IsADirectoryError. - person piit79; 12.05.2021
comment
красиво и просто! - person Theo F; 22.06.2021

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

import os

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

recursively_remove_files(my_directory)

Может немного не по теме, но думаю, многим это пригодится

person fmonegaglia    schedule 27.12.2016
comment
Использование os.walk способом, показанным на странице stackoverflow.com/a/54889532/1709587, возможно, лучший способ удалить все файлы, пока оставляя структуру каталогов нетронутой. - person Mark Amery; 23.11.2019

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

import os
files = os.listdir(yourFilePath)
for f in files:
    os.remove(yourFilePath + f)
person PyBoss    schedule 30.07.2019
comment
Не работает, если есть подкаталоги. - person Mark Amery; 23.11.2019

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

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

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

person B. Filer    schedule 20.06.2016

person    schedule
comment
Если вы работаете с очень большим каталогом, особенно с сетевым каталогом в Windows, и можете управлять средой, в которой работает эта программа, возможно, стоит использовать функцию Py3.5 os.scandir (папка) вместо listdir. После этого синтаксис сильно изменится, но реализовать его довольно просто; рад опубликовать это, если другие захотят. - person Michael Scott Cuthbert; 02.04.2016
comment
Я получаю предупреждение pylint с except Exception as e:, которое читается как W0703: Catching too general exception Exception. Есть ли более конкретное исключение, которое нужно уловить, или мне его игнорировать? - person John Hany; 23.10.2017
comment
@JohnHany, я думаю, ты хочешь поймать OSError. - person MikeB; 07.04.2018
comment
Я получаю OSError: [Errno 26] Текстовый файл занят. Моя файловая структура: Носитель (например, папка в вашем коде) содержит- ›2 файла и 2 каталога, где оба каталога содержат каждый файл - person Vanjith; 19.06.2020