使用Python删除目录中的所有文件


147

我想删除目录中带有扩展名的所有文件.bak。如何在Python中做到这一点?


5
@ slh2080:发布“已解决”不是您在此站点上所做的。您要做的就是选择您实际使用的答案,然后单击对勾标记以表明它已解决您的问题。
S.Lott 2010年

1
抱歉。感谢您指出我的错误。这不是功课,只是在业余时间学习python。我单击了我使用的答案,但这是在看到ghostdog74响应之前。
slh2080 2010年

注意:shutil.rmtree(path)可以使用删除整个目录树。
jfs 2015年

Answers:


270

通过os.listdiros.remove

import os

filelist = [ f for f in os.listdir(mydir) if f.endswith(".bak") ]
for f in filelist:
    os.remove(os.path.join(mydir, f))

或通过glob.glob

import glob, os, os.path

filelist = glob.glob(os.path.join(mydir, "*.bak"))
for f in filelist:
    os.remove(f)

确保位于正确的目录中,并最终使用os.chdir


21
您的第一个示例是使用冗余for循环。您可以使用-[如果在f.endswith(“。bak”)中将os.listdir(“。”)中的f替换为os.remove(f)],则可以一次传递-因为要使用列表推导。或者,您可以将理解中的'if'移至for循环-os.listdir(“。”)中的f:if f.endswith(“。bak”):os.remove(f)
dragonjujo

@ slh2080既然您说问题已解决,为什么不将答案标记为正确答案?
blwy10 2010年

5
当心os.listdir(“。”)!!! 我使用了这段代码,却忘记了更改路径,我所有的代码都消失了!!!尝试了两种不同的实用程序来恢复,但没有运气!
Lei Guo

@LeiGuo修复了该问题。
yugr

26

使用os.chdir以更改目录。使用glob.glob以生成结束它“.bak的”文件名列表。列表的元素只是字符串。

然后,您可以os.unlink用来删除文件。(PS os.unlink和和os.remove是相同功能的同义词。)

#!/usr/bin/env python
import glob
import os
directory='/path/to/dir'
os.chdir(directory)
files=glob.glob('*.bak')
for filename in files:
    os.unlink(filename)

18

在Python 3.5中,os.scandir如果需要检查文件属性或类型会更好-请参见os.DirEntry函数所返回对象的属性。

import os 

for file in os.scandir(path):
    if file.name.endswith(".bak"):
        os.unlink(file.path)

这也不需要更改目录,因为每个目录DirEntry都已包含文件的完整路径。


您缺少冒号,for循环内的第一行应为if file.name.endswith(".bak"):
TSeymour

谢谢!那将教我编写代码而不实际运行它们
Yi Jiang

8

您可以创建一个函数。根据需要添加maxdepth以遍历子目录。

def findNremove(path,pattern,maxdepth=1):
    cpath=path.count(os.sep)
    for r,d,f in os.walk(path):
        if r.count(os.sep) - cpath <maxdepth:
            for files in f:
                if files.endswith(pattern):
                    try:
                        print "Removing %s" % (os.path.join(r,files))
                        #os.remove(os.path.join(r,files))
                    except Exception,e:
                        print e
                    else:
                        print "%s removed" % (os.path.join(r,files))

path=os.path.join("/home","dir1","dir2")
findNremove(path,".bak")



0

我意识到这很老了;但是,这将是仅使用os模块的方法...

def purgedir(parent):
    for root, dirs, files in os.walk(parent):                                      
        for item in files:
            # Delete subordinate files                                                 
            filespec = os.path.join(root, item)
            if filespec.endswith('.bak'):
                os.unlink(filespec)
        for item in dirs:
            # Recursively perform this operation for subordinate directories   
            purgedir(os.path.join(root, item))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.