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

Этот вид преобразования на самом деле невероятно неинтуитивный в Java

Возьмем, например, следующую строку: «100.00»

C: простая стандартная библиотечная функция по крайней мере с 1971 года ( Откуда взялось имя `atoi`? )

int i = atoi(decimalstring);

Java: обязательный проход методом двойного (или Float), за которым следует cast

int i = (int)Double.parseDouble(decimalstring);

У Java наверняка есть некоторые странности в рукаве

373
задан nbro 12 November 2017 в 21:41
поделиться

23 ответа

Обновлен для удаления только файлов и использования метода 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)
353
ответ дан Giorgos Myrianthous 12 November 2017 в 21:41
поделиться

Это нужно сделать, просто используя модуль OS для составления списка, а затем удалить!

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

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

-2
ответ дан B. Filer 12 November 2017 в 21:41
поделиться

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

import shutil, os


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


remove_folder_contents('/path/to/folder')
0
ответ дан Manrique 12 November 2017 в 21:41
поделиться

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

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)
0
ответ дан Amir Rezazadeh 12 November 2017 в 21:41
поделиться

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

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

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

Надеюсь, это поможет. Спасибо.

0
ответ дан End-2-End 12 November 2017 в 21:41
поделиться

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

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)

Может быть, немного не по теме, но я думаю, что многие нашел бы это полезным

0
ответ дан fmonegaglia 12 November 2017 в 21:41
поделиться

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

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

time.sleep(.5)

os.makedirs(folder_location, 0o777)
2
ответ дан Carlos Mermingas 12 November 2017 в 21:41
поделиться

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

import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
3
ответ дан silverbullettt 12 November 2017 в 21:41
поделиться

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

import sh
sh.rm(sh.glob('/path/to/folder/*'))
5
ответ дан Robin Winslow 12 November 2017 в 21:41
поделиться

Я использовал для решения проблемы таким образом:

import shutil
import os

shutil.rmtree(dirpath)
os.mkdir(dirpath)
8
ответ дан ProfHase85 12 November 2017 в 21:41
поделиться

Просто сделай это. Это удалит все файлы внутри каталога, а также из подкаталогов. Без вреда для любой папки / каталога. Хорошо работает на 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))
1
ответ дан Rob Kwasowski 12 November 2017 в 21:41
поделиться

Я знаю, что это старая ветка, но я нашел кое-что интересное на официальном сайте 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))
6
ответ дан Sawyer 12 November 2017 в 21:41
поделиться

Я удивлен, что никто не упомянул о потрясающем 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)
4
ответ дан Husky 12 November 2017 в 21:41
поделиться

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

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

8
ответ дан mhawke 12 November 2017 в 21:41
поделиться
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
ответ дан Jacob Wan 12 November 2017 в 21:41
поделиться

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

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

Код:

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

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

15
ответ дан Robert Siemer 12 November 2017 в 21:41
поделиться

Использование 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)
44
ответ дан jezrael 12 November 2017 в 21:41
поделиться

Расширяя ответ 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))
72
ответ дан Iker Jimenez 12 November 2017 в 21:41
поделиться

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

import os
import glob

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

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

188
ответ дан Jeru Luke 12 November 2017 в 21:41
поделиться

Попробуйте модуль shutil

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

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

Строка документации: рекурсивное удаление дерева каталогов.

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

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

206
ответ дан Alan W. Smith 12 November 2017 в 21:41
поделиться

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

  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")
14
ответ дан Rockallite 12 November 2017 в 21:41
поделиться

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

import os
files = os.listdir(yourFilePath)
for f in files:
    os.remove(yourFilePath + f)
0
ответ дан 22 November 2019 в 23:32
поделиться

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

import os
import glob

files = glob.glob(r'path/*')
for items in files:
    os.remove(items)
2
ответ дан 22 November 2019 в 23:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: