I want to delete all files with the extension .bak
in a directory. How can I do that in Python?
-
2note: to delete an entire directory tree [`shutil.rmtree(path)` could used](https://docs.python.org/3/library/shutil.html#shutil.rmtree). – jfs Jul 02 '15 at 13:37
-
Possible duplicate of [How to delete the contents of a folder in Python?](https://stackoverflow.com/questions/185936/how-to-delete-the-contents-of-a-folder-in-python) – FabioSpaghetti Feb 28 '19 at 10:38
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
.

- 181,842
- 47
- 306
- 310
-
22Your first example is using redundant for loops. You can one pass with - [ os.remove(f) for f in os.listdir(".") if f.endswith(".bak") ] - as list comprehensions are meant to be used. Or you can move the 'if' in the comprehension into the for loop - for f in os.listdir("."): if f.endswith(".bak"): os.remove(f) – dragonjujo Jan 03 '10 at 16:47
-
@slh2080 Since you say the problem has been solved, why not mark the answer as the correct answer? – blwy10 Jan 03 '10 at 17:00
-
6Watch out the os.listdir(".")!!! I used this code and forgot to change the path, all my code were gone!!! Tried two different utilities to recover but with no luck!! – Lei Guo Nov 29 '16 at 03:51
-
-
@dragonjujo I would argue that invoking side effects are very much _not_ how list comprehensions are meant to be used. – marcelm Oct 27 '20 at 10:41
-
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.

- 49,435
- 16
- 136
- 136
-
You're missing a colon, the first line inside the for loop should be `if file.name.endswith(".bak"):` – TSeymour Mar 03 '17 at 18:38
-
-
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)

- 842,883
- 184
- 1,785
- 1,677
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")

- 327,991
- 56
- 259
- 343
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))

- 17
- 2
For one line solution (Both Windows
and Linux
) ;
import glob,os
for file in glob.glob("<your_path>/*.bak"): print(file," these will be deleted")
if input("continue ?") == "Y":
for file in glob.glob("<your_path>/*.bak"): os.remove(file)

- 552
- 1
- 3
- 15
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()

- 699
- 6
- 7
On Linux and macOS you can run simple command to the shell:
subprocess.run('rm /tmp/*.bak', shell=True)

- 13,032
- 8
- 47
- 81
-
4Not a good choice in my opinion. It's not portable and it's probably more expensive due to the extra subprocess. Better to use Python APIs. – Haakon Feb 16 '18 at 21:40
-
2this solution is platform dependent, whereas Python is platform agnostic. – Hamza Rashid Sep 24 '20 at 12:14