首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >python移除/删除非空文件夹/目录的最有效方法是什么?

python移除/删除非空文件夹/目录的最有效方法是什么?

原创
作者头像
Python学习者
发布于 2024-05-09 07:54:49
发布于 2024-05-09 07:54:49
52800
代码可运行
举报
文章被收录于专栏:Python学习者Python学习者
运行总次数:0
代码可运行

1.标准库参考:shutil.rmtree。

根据设计,rmtree在包含只读文件的文件夹树上失败。如果要删除文件夹,不管它是否包含只读文件,请使用

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import shutil
shutil.rmtree('/folder_name', ignore_errors=True)

2.从os.walk()上的python文档中:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
# Delete everything reachable from the directory named in 'top',
# assuming there are no symbolic links.
# CAUTION:  This is dangerous!  For example, if top == '/', it
# could delete all your disk files.
import os
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.从python 3.4可以使用:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import pathlib
 
def delete_folder(pth) :
    for sub in pth.iterdir() :
        if sub.is_dir() :
            delete_folder(sub)
        else :
            sub.unlink()
    pth.rmdir() # if you just want to delete dir content, remove this line 

其中pth是pathlib.Path实例。很好,但可能不是最快的。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import os
import stat
import shutil
 
def errorRemoveReadonly(func, path, exc):
    excvalue = exc[1]
    if func in (os.rmdir, os.remove) and excvalue.errno == errno.EACCES:
        # change the file to be readable,writable,executable: 0777
        os.chmod(path, stat.S_IRWXU | stat.S_IRWXG | stat.S_IRWXO)  
        # retry
        func(path)
    else:
        # raiseenter code here
 
shutil.rmtree(path, ignore_errors=False, onerror=errorRemoveReadonly)

如果设置了ignore_errors,则忽略错误;否则,如果设置了onerror,则调用它以使用参数(func、path、exc_info)处理错误,其中func是os.listdir、os.remove或os.rmdir;path是导致函数失败的函数的参数;exc_infosys.exc_info()返回的元组。如果"忽略错误"为"假",而"OnError"为"无",则会引发异常。请在此处输入代码。

只需一些python3.5选项就可以完成上面的答案

删除空文件夹

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import os
import shutil
from send2trash import send2trash # (shutil delete permanently)
 
root = r"C:\Users\Me\Desktop\test"  
for dir, subdirs, files in os.walk(root):  
    if subdirs == [] and files == []:
           send2trash(dir)
           print(dir,": folder removed")
   # 如果文件夹包含此文件,请同时删除它
   elif subdirs == [] and len(files) == 1: # if contains no sub folder and only 1 file
        if files[0]=="desktop.ini" or:  
            send2trash(dir)
            print(dir,": folder removed")
        else:
            print(dir)
 
    #删除仅包含.srt或.txt文件的文件夹
    elif subdirs == []: #if dir doesn’t contains subdirectory
        ext = (".srt",".txt")
        contains_other_ext=0
        for file in files:
            if not file.endswith(ext):  
                contains_other_ext=True
        if contains_other_ext== 0:
                send2trash(dir)
                print(dir,": dir deleted")    

如果文件夹大小小于400KB,则删除该文件夹:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
def get_tree_size(path):
   """Return total size of files in given path and subdirs."""
    total = 0
    for entry in os.scandir(path):
        if entry.is_dir(follow_symlinks=False):
            total += get_tree_size(entry.path)
        else:
            total += entry.stat(follow_symlinks=False).st_size
    return total
 
 
for dir, subdirs, files in os.walk(root):  
    If get_tree_size(dir) < 400000:  # ≈ 400kb
        send2trash(dir)
    print(dir,"dir deleted") 

如果您确定要删除整个目录树,并且对目录的内容不再感兴趣,那么对整个目录树进行爬行是愚蠢的…只需从python调用本机操作系统命令即可。它将更快、更高效,而且内存消耗更少。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
RMDIR c:\blah /s /q

或* nix

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
rm -rf /home/whatever

在Python中,代码看起来像..

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import sys
import os
 
mswindows = (sys.platform =="win32")
 
def getstatusoutput(cmd):
   """Return (status, output) of executing cmd in a shell."""
    if not mswindows:
        return commands.getstatusoutput(cmd)
    pipe = os.popen(cmd + ' 2>&1', 'r')
    text = pipe.read()
    sts = pipe.close()
    if sts is None: sts = 0
    if text[-1:] == '
': text = text[:-1]
    return sts, text
 
 
def deleteDir(path):
   """deletes the path entirely"""
    if mswindows:
        cmd ="RMDIR"+ path +" /s /q"
    else:
        cmd ="rm -rf"+path
    result = getstatusoutput(cmd)
    if(result[0]!=0):
        raise RuntimeError(result[1]) 

从docs.python.org:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
This example shows how to remove a directory tree on Windows where
some of the files have their read-only bit set. It uses the onerror
callback to clear the readonly bit and reattempt the remove. 
代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import os, stat
import shutil
 
def remove_readonly(func, path, _):
   "Clear the readonly bit and reattempt the removal"
    os.chmod(path, stat.S_IWRITE)
    func(path)
 
shutil.rmtree(directory, onerror=remove_readonly) 

在删除之前检查文件夹是否存在,这样更可靠。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import shutil
def remove_folder(path):
    # check if folder exists
    if os.path.exists(path):
         # remove if exists
         shutil.rmtree(path)
    else:
         # throw your exception to handle this special scenario
         raise XXError("your exception")
remove_folder("/folder_name")

如果您不想使用shutil模块,可以只使用os模块。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
from os import listdir, rmdir, remove
for i in listdir(directoryToRemove):
    os.remove(os.path.join(directoryToRemove, i))
rmdir(directoryToRemove) # Now the directory is empty of files
 
def deleteDir(dirPath):
    deleteFiles = []
    deleteDirs = []
    for root, dirs, files in os.walk(dirPath):
        for f in files:
            deleteFiles.append(os.path.join(root, f))
        for d in dirs:
            deleteDirs.append(os.path.join(root, d))
    for f in deleteFiles:
        os.remove(f)
    for d in deleteDirs:
        os.rmdir(d)
    os.rmdir(dirPath) 

为了简单起见,可以使用os.system命令:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import os
os.system("rm -rf dirname")

很明显,它实际上调用系统终端来完成这个任务。

删除一个文件夹,即使它可能不存在(避免了Charles Chow的答案中的竞争条件),但当其他事情出错时仍有错误(例如权限问题、磁盘读取错误、文件不是目录)

对于Python 3 .x:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import shutil
 
def ignore_absent_file(func, path, exc_inf):
    except_instance = exc_inf[1]
    if isinstance(except_instance, FileNotFoundError):
        return
    raise except_instance
 
shutil.rmtree(dir_to_delete, onerror=ignore_absent_file) 

通过os.walk,我将提出由3个一行程序python调用组成的解决方案:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
python -c"import sys; import os; [os.chmod(os.path.join(rs,d), 0o777) for rs,ds,fs in os.walk(_path_) for d in ds]"
python -c"import sys; import os; [os.chmod(os.path.join(rs,f), 0o777) for rs,ds,fs in os.walk(_path_) for f in fs]"
python -c"import os; import shutil; shutil.rmtree(_path_, ignore_errors=False)" 

第一个脚本chmod的所有子目录,第二个脚本chmod的所有文件。然后,第三个脚本会毫无障碍地删除所有内容。

我在Jenkins工作中的"shell脚本"中对此进行了测试(我不想将新的python脚本存储到SCM中,这就是为什么搜索单行解决方案),它适用于LinuxWindows

使用python 3.7和linux仍然有不同的方法:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
import subprocess
from pathlib import Path
 
#using pathlib.Path
path = Path('/path/to/your/dir')
subprocess.run(["rm","-rf", str(path)])
 
#using strings
path ="/path/to/your/dir"
subprocess.run(["rm","-rf", path]) 

本质上,它使用python的子进程模块来运行bash脚本$ rm -rf '/path/to/your/dir,就好像使用终端来完成相同的任务一样。它不是完全的python,但它可以完成。

我将pathlib.Path示例包括在内的原因是,根据我的经验,它在处理许多变化的路径时非常有用。导入pathlib.Path模块并将最终结果转换为字符串的额外步骤对于我的开发时间来说通常会降低成本。如果Path.rmdir()带有一个arg选项来显式处理非空的dir,那就方便了。

对于Windows,如果目录不是空的,并且您有只读文件,或者收到如下错误:

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
Access is denied
The process cannot access the file because it is being used by another process

试试这个,os.system('rmdir /S /Q"{}"'.format(directory))。

它相当于Linux/Mac中的rm -rf。

我找到了一种非常简单的方法来删除Windows操作系统上的任何文件夹(甚至不是空的)或文件。

代码语言:python
代码运行次数:0
运行
AI代码解释
复制
os.system('powershell.exe  rmdir -r D:\workspace\Branches\*%s* -Force' %CANDIDATE_BRANCH)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
PQ-综合实战:数据都堆在一列里,怎么办?
小勤:大海,最近公司系统导出来的订单数据害屎人了,所有信息都堆在了一列里面,你看,怎么转成规范的明细表啊?
大海Power
2021/08/30
5960
PQ-数据转换13:逆透视及需要注意的空值丢失问题
小勤:大海,用PowerQuery做逆透视的时候,那些空数据都没了?
大海Power
2021/08/31
2.4K0
Excel频繁重复的表间数据对比,今后只需一键刷新
大海:嗯。的确是,PowerQuery最大的优势就是只需要干一次,以后有新数据就刷新一下就搞定,尤其适合这些需要频繁重复操作的工作。
大海Power
2021/08/30
9460
这个问题写SQL都不好,用Power Query却能随数据增加一键刷新
小勤:大海,公司有个数据本来应该2列的,他们分成好多个2列并排着录了,后面数据统计可麻烦了,怎么转成规范的数据啊?
大海Power
2021/08/31
1.4K0
Excel PQ爬取A股实时信息——多页整合篇
小勤:大海,上次你教我《爬取了沪深A股中的一页》内容,我练过了,这次,继续教我多爬取几个页面呗。
大海Power
2021/08/30
1.5K0
PQ-综合实战:爬取人民币汇率中间价
大海:这个得看这个网站的数据查询反馈机制,有的比较简单,有的可能加了很多安全机制,那样就比较复杂。
大海Power
2021/08/30
9870
PQ-综合实战:根据关键词确定订单最大体积重量比
小勤:一个订单里有多个货物的时候,还得先确定货物的体积重量比,然后整个订单的体积重量比都要以体积重量比最大的那个货物为准。
大海Power
2021/08/30
4010
PQ-数据转换14:轻松搞定多表追加合并
本文以一个简单示例体现追加合并的过程——注意,本合并所实现的数据汇总是针对已经单独导入Power Query的多个表,因此,只能实现已明确的表在数据更新的情况下的更新,而不能实现增加表情况下的数据接入。若需要实现增加表情况下的数据导入,请参考文章《批量汇总多Excel文件数据系列文章12篇,助你变成老司机,轻松躲坑666!》。
大海Power
2021/08/31
1.4K0
Excel频繁重复的表间数据对比,用Power Query一键刷新
前些天,大神高飞对本人小黄书做了一次送书活动,得到大家的热烈支持,小黄书自上市以来,保持Excel Power系列新书榜第1,非常感谢大家的认可:
大海Power
2021/08/30
2.4K0
PQ-综合实战:根据关键词匹配查找对应内容
今天的文章有点儿长,步骤有点儿多,但这个综合操作很值得练好,以后扩展应用的空间很大。
大海Power
2021/08/30
2K0
这个Excel公式太酷?然并卵,我学不会!!!
小勤:大海,今天又看到个大神分享的Excel公式,感觉还是学不会的那种,Power Query能破吗?
大海Power
2021/08/30
4420
PQ里轻松实现卡号每4位分隔显示
小勤:现在的银行卡都是一长串的数字,能否用Power Query做成每4位加一个空格显示的方式?现在在Excel里可以写公式,但公式比较长,而且增加数据的时候也麻烦。
大海Power
2021/08/30
6350
中国式多重行列表头的数据规范化
大海:嗯,这种情况处理起来稍为复杂一点点,不过也不难,都是一些基础操作的灵活运用。
大海Power
2021/08/30
5100
多表数据汇总查询之4、同一查询条件多值处理
大海:那就做个多值查询的呗。比如你可以在货品代码的查询条件里用顿号或分号之类的做分隔符输入多个货品代码,然后就一次查出来。
大海Power
2021/08/30
8190
PQ-综合实战:按条件动态化查询多表数据之1、查询条件动态化入门
大海:你想啊,咱们如果将查询条件放到PQ里,然后在PQ里对数据合并的基础上,去动态引用查询条件,不就可以实现了吗?
大海Power
2021/08/30
1.5K0
Excel数据一键转置
Excel里有选择性粘贴,转置;PQ里当然也不能少,而且就是一个按钮点一下。先上数据:
大海Power
2021/08/30
5760
PQ-数据转换12:分组依据,分类汇总但不拖泥带水
说实话,我真的不喜欢Excel里的分类汇总功能,一是要求首先对数据进行排序,然后才能做分类汇总,这都没有关系,最大的问题是,分类汇总后,汇总数据和明细数据混在一起,拖泥带水,严重破坏数据源表的结构,为后续做数据分析造成很大的障碍。所以,要对数据进行汇总分析时,我通常是建议使用数据透视的。
大海Power
2021/08/31
1.4K0
PQ-数据转换9:特殊格式日期的类型转换问题
小勤:我也不知道。那现在怎么办?总不能要在Excel里改成咱们的日常格式才能导进去吧?
大海Power
2021/08/31
2.3K0
PQ-综合实战:按条件动态化查询多表数据之2、多查询条件动态化
小勤:但是,按照操作习惯,我们一般是对于空的查询条件就是默认全部的,比如把查询条件里的”月“清空,我希望结果是全部月份的,但现在如果清空,查询结果就为空了。
大海Power
2021/08/30
1.9K0
多表数据汇总查询之6、字段间比较的查询条件
大海:你可以考虑这样啊,先在PQ的数据里构造一个两个数比较的结果列,然后是不是就跟同一条件多值查询(见文章《按条件动态化查询多表数据之4、同一查询条件多值处理》)的一样了?
大海Power
2021/08/30
8320
推荐阅读
相关推荐
PQ-综合实战:数据都堆在一列里,怎么办?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档