如何在Python中删除文件夹的内容?

时间:2008-10-09 04:22:34

标签: python file local delete-directory

如何在Python中删除本地文件夹的内容?

当前项目适用于Windows,但我也希望看到* nix。

26 个答案:

答案 0 :(得分:334)

更新为仅删除文件并使用评论中建议的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)

答案 1 :(得分:202)

尝试使用shutil模块

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

说明:shutil.rmtree(path, ignore_errors=False, onerror=None)

     

Docstring:递归删除   目录树。

     

如果设置了ignore_errors,则会出现错误   忽略;否则,如果设置了onerror,   它被调用来处理错误   参数(func, path, exc_info)其中   funcos.listdiros.remove或   os.rmdir; path就是这个论点   导致它失败的功能;和   exc_info是由...返回的元组   sys.exc_info()。如果是ignore_errors   false,onerrorNone,是   异常被提出。

重要提示:请注意shutil.rmtree()不仅会删除目标文件夹的内容。它也会删除文件夹本身。

答案 2 :(得分:183)

你可以这样做:

import os
import glob

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

您当然可以在路径中使用其他过滤器,例如:/YOU/PATH/*.txt用于删除目录中的所有文本文件。

答案 3 :(得分:69)

扩展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))

答案 4 :(得分:44)

使用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)

答案 5 :(得分:15)

作为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)) )

答案 6 :(得分:14)

注意:如果有人拒绝投票给我答案,我可以在这里解释一下。

  1. 每个人都喜欢简短的答案。然而,有时现实并非如此简单。
  2. 回到我的回答。我知道shutil.rmtree()可用于删除目录树。我在自己的项目中多次使用它。但您必须意识到目录本身也会被shutil.rmtree() 删除。虽然这对某些人来说可能是可以接受的,但对于删除文件夹的内容(没有副作用),这不是一个有效的答案。
  3. 我会告诉你一个副作用的例子。假设您有一个目录,其中包含自定义所有者和模式位,其中包含大量内容。然后,您使用shutil.rmtree()将其删除,然后使用os.mkdir()进行重建。并且您将获得一个空目录,其中包含默认(继承)所有者和模式位。虽然您可能有权删除内容甚至目录,但您可能无法在目录上设置原始所有者和模式位(例如,您不是超级用户)。
  4. 最后,耐心等待并阅读代码。它很长很丑(看得见),但被证明是可靠和有效的(使用中)。

  5. 这是一个漫长而丑陋但又可靠而有效的解决方案。

    它解决了其他问题无法解决的一些问题:

    • 它正确处理符号链接,包括不在符号链接上调用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")
    

答案 7 :(得分:13)

这是迄今为止唯一的答案,其中:

  • 删除所有符号链接
    • 死链接
    • 指向目录的链接
    • 指向文件的链接
  • 删除子目录
  • 不会删除父目录

代码:

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

正如许多其他答案一样,这并不会尝试调整权限以启用文件/目录的删除。

答案 8 :(得分:9)

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]

之前的评论还提到在Python 3.5+中使用os.scandir。例如:

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)

答案 9 :(得分:8)

您可能最好使用os.walk()

os.listdir()不会将文件与目录区分开来,并且您很快就会在尝试取消链接这些文件时遇到麻烦。有一个使用os.walk()递归删除目录here的好例子,并提示如何使其适应您的情况。

答案 10 :(得分:8)

我曾经这样解决问题:

import shutil
import os

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

答案 11 :(得分:6)

我知道这是一个老线程,但我从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))

答案 12 :(得分:6)

我必须从单个父目录内的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)

希望这会有所帮助。

答案 13 :(得分:5)

又一个解决方案:

import sh
sh.rm(sh.glob('/path/to/folder/*'))

答案 14 :(得分:4)

如果您使用的是* nix系统,为什么不利用系统命令?

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

答案 15 :(得分:2)

我在rmtree makedirs之间通过添加time.sleep()来解决了这个问题:

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

time.sleep(.5)

os.makedirs(folder_location, 0o777)

答案 16 :(得分:2)

嗯,我认为这段代码可以正常工作。它不会删除该文件夹,您可以使用此代码删除具有特定扩展名的文件。

import os
import glob

files = glob.glob(r'path/*')
for items in files:
    os.remove(items)

答案 17 :(得分:1)

要删除我使用的文件夹中的所有文件:

import os
for i in os.listdir():
    os.remove(i)

答案 18 :(得分:0)

使用以下方法删除目录的内容,而不是目录本身:

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)

答案 19 :(得分:0)

只需执行此操作。这将删除目录以及子目录中的所有文件。不会损害任何文件夹/目录。在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))

答案 20 :(得分:0)

令我惊讶的是,没有人提到出色的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)

答案 21 :(得分:0)

非常直观的方法:

import shutil, os


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


remove_folder_contents('/path/to/folder')

答案 22 :(得分:0)

假设temp_dir被删除,则使用os的单行命令将是:

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

注意:这只是删除文件的“ 1-线”,“不删除目录”。

希望这会有所帮助。谢谢。

答案 23 :(得分:0)

回答有限的具体情况: 假设您想要在维护子文件夹树的同时删除文件,则可以使用递归算法:

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)

也许稍微偏离主题,但我认为很多人会发现它很有用

答案 24 :(得分:-1)

删除文件夹中的所有文件/删除所有文件的最简单方法

import os
files = os.listdir(yourFilePath)
for f in files:
    os.remove(yourFilePath + f)

答案 25 :(得分:-2)

这应该只是使用OS模块列出然后删除!

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

为我工作,任何问题都让我知道!