Как удалить содержимое папки в Python? - PullRequest
361 голосов
/ 09 октября 2008

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

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

Ответы [ 21 ]

8 голосов
/ 17 июня 2013

Раньше я решал проблему следующим образом:

import shutil
import os

shutil.rmtree(dirpath)
os.mkdir(dirpath)
6 голосов
/ 02 мая 2013

Я знаю, что это старая ветка, но я нашел кое-что интересное на официальном сайте 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))
5 голосов
/ 12 мая 2014

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

import sh
sh.rm(sh.glob('/path/to/folder/*'))
3 голосов
/ 12 июня 2018

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

import os
path = 'folder/to/clean'
os.system('rm -rf %s/*' % path)
2 голосов
/ 21 марта 2017

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

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

time.sleep(.5)

os.makedirs(folder_location, 0o777)
1 голос
/ 15 мая 2019

Я удивлен, что никто не упомянул о замечательном 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)
0 голосов
/ 26 февраля 2019

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

import os, re, os.path
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))
0 голосов
/ 03 февраля 2019

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

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 голосов
/ 05 октября 2018

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

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

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

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

0 голосов
/ 27 декабря 2016

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

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)

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

...