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



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



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

790   18  

18 ответов:

Обновлено только для удаления файлов и использования ОС.путь.метод 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)

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

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

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

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

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

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

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)

Как 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)) )

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

  1. все любят короткие и простые ответы. Однако иногда реальность не так проста.
  2. вернемся к моему ответу. Я знаю shutil.rmtree() может использоваться для удаления дерева каталогов. Я использовал его много раз в своих проектах. Но вы должны понимать, что сам каталог также будет удален shutil.rmtree(). Хотя это может быть приемлемо для некоторые, это не правильный ответ для удаление содержимого папки (без побочных эффектов).
  3. я покажу вам пример побочных эффектов. Предположим, что у вас есть каталог с customized владелец и режим бит, где есть много содержимого. Затем вы удаляете его с помощью 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")

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

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

код:

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

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

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

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

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]

в более раннем комментарии также упоминается использование ОС.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)

я использовал, чтобы решить эту проблему таким образом:

import shutil
import os

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

Я konw это старый поток, но я нашел что-то интересное с официального сайта 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/*'))

Я решил проблему ошибки с rmtree makedirs, добавив время.сон () между ними.

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

time.sleep(.5)

os.makedirs(folder_location, 0o777)

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

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

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

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
DIR = os.list('Folder')
for i in range(len(DIR)):
    os.remove('Folder'+chr(92)+i)

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

Comments

    Ничего не найдено.