如何删除文件夹的内容



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

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

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

你可以简单地这样做:

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

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

您可以使用以下方法

shutil.rmtree删除文件夹本身及其所有内容:

import shutil
shutil.rmtree('/path/to/folder')
shutil.rmtree(path, ignore_errors=False, onerror=None)


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

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

惊讶没有人提到做这项工作的出色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)
使用 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)

这个:

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

法典:

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

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

在 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]

注意:如果有人投票反对我的答案,我在这里有一些事情要解释。

  1. 每个人都喜欢简短的"n"简单答案。然而,有时现实并非如此简单。
  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")

作为单行:

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

我曾经这样解决问题:

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

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

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

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

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)

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

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

为此最好使用 os.walk()

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

我知道

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

我不得不从单个父目录中的 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)

希望这有帮助。

另一种解决方案:

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

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

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

非常直观的方法:

import shutil, os

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

remove_folder_contents('/path/to/folder')

使用此函数

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

我尝试过使用 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

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

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)

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

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)

也许有点跑题,但我想很多人会觉得它很有用

我通过在以下time.sleep()之间添加rmtree makedirs解决了的问题:

if os.path.isdir(folder_location):
    shutil.rmtree(folder_location)
time.sleep(.5)
os.makedirs(folder_location, 0o777)

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

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

这应该只需使用操作系统模块列出然后删除即可

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

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

相关内容

  • 没有找到相关文章

最新更新