I want to delete all files with the extension .bak in a directory. How can I do that in Python?
9 Answers
Via os.listdir and os.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)) Using only a single loop:
for f in os.listdir(mydir): if not f.endswith(".bak"): continue os.remove(os.path.join(mydir, f)) Or via glob.glob:
import glob, os, os.path filelist = glob.glob(os.path.join(mydir, "*.bak")) for f in filelist: os.remove(f) Be sure to be in the correct directory, eventually using os.chdir.
6 Comments
In Python 3.5, os.scandir is better if you need to check for file attributes or type - see os.DirEntry for properties of the object that's returned by the function.
import os for file in os.scandir(path): if file.name.endswith(".bak"): os.unlink(file.path) This also doesn't require changing directories since each DirEntry already includes the full path to the file.
3 Comments
if file.name.endswith(".bak"):Use os.chdir to change directory . Use glob.glob to generate a list of file names which end it '.bak'. The elements of the list are just strings.
Then you could use os.unlink to remove the files. (PS. os.unlink and os.remove are synonyms for the same function.)
#!/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) Comments
you can create a function. Add maxdepth as you like for traversing subdirectories.
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") Comments
1 Comment
I realize this is old; however, here would be how to do so using just the os module...
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)) Comments
Or using pathlib.Path:
from pathlib import Path for file in Path("/path/to/folder").glob("*"): file.unlink() This way one also could specify to only delete files that match the glob pattern. For example: .glob("*.txt") to only remove text files.
And for a recursive removal of all files in subfolders just use rglob instead of glob. The following would delete all txt-files in the specified folder and all it's subfolders:
for file in Path("/path/to/folder").rglob("*.txt"): file.unlink() Comments
On Linux and macOS you can run simple command to the shell:
subprocess.run('rm /tmp/*.bak', shell=True)
shutil.rmtree(path)could used.