如何删除文件夹的内容?

2025-03-05 09:15:00
admin
原创
60
摘要:问题描述:如何在 Python 中删除本地文件夹的内容?当前项目是针对 Windows 的,但我也想看到 *nix。解决方案 1:import os, shutil folder = '/path/to/folder' for filename in os.listdir(folder): file_...

问题描述:

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

当前项目是针对 Windows 的,但我也想看到 *nix。


解决方案 1:

import os, shutil
folder = '/path/to/folder'
for filename in os.listdir(folder):
    file_path = os.path.join(folder, filename)
    try:
        if os.path.isfile(file_path) or os.path.islink(file_path):
            os.unlink(file_path)
        elif os.path.isdir(file_path):
            shutil.rmtree(file_path)
    except Exception as e:
        print('Failed to delete %s. Reason: %s' % (file_path, e))

解决方案 2:

你可以简单地这样做:

import os
import glob

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

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

解决方案 3:

您可以使用以下命令删除文件夹本身及其所有内容shutil.rmtree

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

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

删除整个目录树;路径必须指向目录(但不能是指向目录的符号链接)。如果ignore_errors为真,则将忽略因删除失败而导致的错误;如果为假或省略,则通过调用onerror指定的处理程序来处理此类错误,如果省略,则引发异常。

解决方案 4:

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

解决方案 5:

我很惊讶没有人提到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)

解决方案 6:

使用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) or os.path.islink(file_object_path):
        os.unlink(file_object_path)
    else:
        shutil.rmtree(file_object_path)

解决方案 7:

在 Python 3.6+ 中使用os.scandir 和上下文管理器协议:

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]

解决方案 8:

这:

  • 删除所有符号链接

+ 死链接
+ 目录链接
+ 文件链接
  • 删除子目录

  • 不删除父目录

代码:

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

与许多其他答案一样,这不会尝试调整权限以允许删除文件/目录。

解决方案 9:

注意:如果有人反对我的回答,我在这里需要解释一下。

  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")

解决方案 10:

一句话:

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

解决方案 11:

我曾经以这种方式解决问题:

import shutil
import os

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

解决方案 12:

要删除文件夹 a 内的所有文件,我使用:

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

解决方案 13:

要删除目录及其子目录内的所有文件(而不删除文件夹本身),只需执行以下操作:

import os
mypath = "my_folder" #Enter your path here
for root, dirs, files in os.walk(mypath, topdown=False):
    for file in files:
        os.remove(os.path.join(root, file))

    # Add this block to remove folders
    for dir in dirs:
        os.rmdir(os.path.join(root, dir))

# Add this line to remove the root folder at the end
os.rmdir(mypath)

解决方案 14:

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

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

解决方案 15:

您最好使用os.walk()它。

os.listdir()不区分文件和目录,您在尝试取消链接时很快就会遇到麻烦。这里os.walk()有一个使用递归删除目录的很好示例,并提示了如何根据您的情况进行调整。

解决方案 16:

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

解决方案 17:

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

希望这有帮助。

解决方案 18:

另一个解决方案:

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

解决方案 19:

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

import os
import glob

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

解决方案 20:

使用此功能

import os
import glob

def truncate(path):
    files = glob.glob(path+'/*.*')
    for f in files:
        os.remove(f)

truncate('/my/path')

解决方案 21:

非常直观的做法:

import shutil, os


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


remove_folder_contents('/path/to/folder')

解决方案 22:

针对有限的特定情况进行回答:假设您想要删除文件同时维护子文件夹树,则可以使用递归算法:

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)

可能有点题外,但我认为很多人会觉得它有用

解决方案 23:

我尝试了其他方法,包括 os 和 glob 包,遇到了权限问题,但使用这个方法,我没有遇到权限问题,而且少用了一个包。如果子目录存在,可能会失败。

import os

def remove_files_in_folder(folderPath):
        # loop through all the contents of folder
        for filename in os.listdir(folderPath):
            # remove the file
            os.remove(f"{folderPath}/{filename}")

remove_files_in_folder('./src/inputFiles/tmp')

文件夹结构

root
  |
  +-- main.py
  |
  +-- src
       |
       +-- inputFiles
            |
            +-- tmp
                 |
                 +-- file1.txt
                 +-- img1.png

解决方案 24:

rglob()以下是使用的解决方案pathlib。请注意Path.rglob("*")(和Path.glob("*"))将包含隐藏文件。还请注意,我们不能使用Path.rmdir(),因为它只能删除空目录。这就是为什么我们需要使用shutil.rmtree()来删除目录。

from pathlib import Path
import shutil

folder = Path("/path/to/folder")
for item in folder.rglob("*"):
    try:
        if item.is_dir():
            shutil.rmtree(item)
        else:
            item.unlink()
    except OSError as ose:
        print(f"Failed to delete {item}. {ose}")

解决方案 25:

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

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)

解决方案 26:

rmtree makedirs我通过添加以下内容解决了该问题time.sleep()

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

time.sleep(.5)

os.makedirs(folder_location, 0o777)

解决方案 27:

如果你像我一样使用超棒的PyFilesystem2库,那么你就可以使用文档中描述的现成解决方案。
例如,要清除用户主目录下的目录而不删除目录本身,请结合使用:
Videos`FS.removetree`FS.opendir

import fs

home_fs = fs.open_fs("~")
home_fs.opendir("/Videos").removetree("/")
home_fs.exists("/Videos")  # True
home_fs.isempty("/Videos")  # True

解决方案 28:

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

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

解决方案 29:

只需使用 OS 模块列出然后删除就可以了!

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

对我有用,有任何问题请告诉我!

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2757  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1693  
  在全球化的浪潮下,企业的业务范围不断拓展,跨文化协作变得愈发普遍。不同文化背景的团队成员在合作过程中,由于语言、价值观、工作习惯等方面的差异,往往会面临诸多沟通挑战。而产品生命周期管理(PLM)系统作为企业管理产品全生命周期的重要工具,如何有效支持跨文化协作成为了关键问题。通过合理运用沟通策略,PLM系统能够在跨文化团...
plm是什么软件   15  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与管理过程中扮演着至关重要的角色,其中文档版本控制是确保产品数据准确性、完整性和可追溯性的关键环节。有效的文档版本控制能够避免因版本混乱导致的错误、重复工作以及沟通不畅等问题,提升企业整体的运营效率和产品质量。接下来,我们将深入探讨 PLM 系统实现文档版本控制的 6...
plm是什么意思   19  
  PLM(产品生命周期管理)项目管理旨在通过有效整合流程、数据和人员,优化产品从概念到退役的整个生命周期。在这个过程中,敏捷测试成为确保产品质量、加速交付的关键环节。敏捷测试强调快速反馈、持续改进以及与开发的紧密协作,对传统的测试流程提出了新的挑战与机遇。通过对测试流程的优化,能够更好地适应PLM项目的动态变化,提升产品...
plm管理系统   18  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用