slh2080
slh2080

Reputation: 1711

Deleting all files in a directory with Python

I want to delete all files with the extension .bak in a directory. How can I do that in Python?

Upvotes: 170

Views: 307871

Answers (9)

Jobomat
Jobomat

Reputation: 709

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()

Upvotes: 0

Veysel Olgun
Veysel Olgun

Reputation: 598

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)

Upvotes: 0

miku
miku

Reputation: 188134

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.

Upvotes: 321

M.Markfort
M.Markfort

Reputation: 17

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))

Upvotes: 1

Vitaly Zdanevich
Vitaly Zdanevich

Reputation: 14906

On Linux and macOS you can run simple command to the shell:

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

Upvotes: -1

Yi Jiang
Yi Jiang

Reputation: 50135

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.

Upvotes: 28

ghostdog74
ghostdog74

Reputation: 342859

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")

Upvotes: 8

unutbu
unutbu

Reputation: 880607

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)

Upvotes: 26

Ignacio Vazquez-Abrams
Ignacio Vazquez-Abrams

Reputation: 799230

First glob them, then unlink.

Upvotes: 2

Related Questions