2010-01-03 101 views
123

我想删除目录中扩展名为.bak的所有文件。我怎样才能在Python中做到这一点?使用Python删除目录中的所有文件

+5

@ slh2080:发布“解决”是不是你在这个网站做什么。你所做的是选择你实际使用的答案,然后点击复选标记来表明它解决了你的问题。 – 2010-01-03 17:05:53

+0

对不起。感谢您指出我的错误。这不是作业,只是在业余时间学习python。我点击了我使用的答案,但那是在我看到ghostdog74响应之前。 – slh2080 2010-01-10 04:27:16

+0

注意:要删除整个目录树['shutil.rmtree(path)''可以使用](https://docs.python.org/3/library/shutil.html#shutil.rmtree)。 – jfs 2015-07-02 13:37:24

回答

221

通过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

+16

你的第一个例子是使用冗余for循环。你可以通过 - [os.remove(f)for os.listdir(“。”)if f.endswith(“。bak”)] - ,因为列表解析是为了使用。如果f.endswith(“.bak”): os.remove(f) – dragonjujo 2010-01-03 16:47:33

+0

@或者您可以将理解中的'if'移动到for循环中 - for os.listdir(“。”): @ slh2080既然您说问题已解决,为什么不将答案标记为正确答案? – blwy10 2010-01-03 17:00:36

+4

@dragonjujo,是的,我知道,但我认为这将是更清晰的这种方式.. – miku 2010-01-03 17:12:18

23

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

然后您可以使用os.unlink删除文件。 (PS。os.unlinkos.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) 
6

,你可以创建一个函数。根据需要添加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") 
7

在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改变目录已经包含完整的文件路径。

+0

你错过了一个冒号,for循环中的第一行应该是'if file.name.endswith(“。bak”):' – TSeymour 2017-03-03 18:38:50

+0

谢谢!这会教我编写代码而不实际运行它们 – 2017-03-04 01:40:02

0

在Linux和MacOS,你可以在shell中运行简单的命令:

subprocess.run('rm /tmp/*.bak', shell=True) 
+0

在我看来,这不是一个好的选择。这不是便携式的,由于额外的子过程,可能会更昂贵。最好使用Python API。 – Haakon 2018-02-16 21:40:19

相关问题