python – Most pythonic way to delete a file which may not exist

The Question :

487 people think this question is useful

I want to delete the file filename if it exists. Is it proper to say

if os.path.exists(filename):
    os.remove(filename)

Is there a better way? A one-line way?

The Question Comments :
  • Do you want to try to delete a file if it exists (and fail if you lack permissions) or to do a best-effort delete and never have an error thrown back in your face?
  • I wanted to do “the former” of what @DonalFellows said. For that, I guess Scott’s original code would be a good approach?
  • Make a function called unlink and put it in namespace PHP.
  • @LarsH See the second code block of the accepted answer. It reraises the exception if the exception is anything but a “no such file or directory” error.

The Answer 1

656 people think this answer is useful

A more pythonic way would be:

try:
    os.remove(filename)
except OSError:
    pass

Although this takes even more lines and looks very ugly, it avoids the unnecessary call to os.path.exists() and follows the python convention of overusing exceptions.

It may be worthwhile to write a function to do this for you:

import os, errno

def silentremove(filename):
    try:
        os.remove(filename)
    except OSError as e: # this would be "except OSError, e:" before Python 2.6
        if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
            raise # re-raise exception if a different error occurred

The Answer 2

179 people think this answer is useful

I prefer to suppress an exception rather than checking for the file’s existence, to avoid a TOCTTOU bug. Matt’s answer is a good example of this, but we can simplify it slightly under Python 3, using contextlib.suppress():

import contextlib

with contextlib.suppress(FileNotFoundError):
    os.remove(filename)

If filename is a pathlib.Path object instead of a string, we can call its .unlink() method instead of using os.remove(). In my experience, Path objects are more useful than strings for filesystem manipulation.

Since everything in this answer is exclusive to Python 3, it provides yet another reason to upgrade.

The Answer 3

52 people think this answer is useful

os.path.exists returns True for folders as well as files. Consider using os.path.isfile to check for whether the file exists instead.

The Answer 4

39 people think this answer is useful

In the spirit of Andy Jones’ answer, how about an authentic ternary operation:

os.remove(fn) if os.path.exists(fn) else None

The Answer 5

26 people think this answer is useful

As of Python 3.8, use missing_ok=True and pathlib.Path.unlink (docs here)

from pathlib import Path

my_file = Path("./dir1/dir2/file.txt")

# Python 3.8+
my_file.unlink(missing_ok=True)

# Python 3.7 and earlier
if my_file.exists():
    my_file.unlink()

The Answer 6

9 people think this answer is useful

Another way to know if the file (or files) exists, and to remove it, is using the module glob.

from glob import glob
import os

for filename in glob("*.csv"):
    os.remove(filename)

Glob finds all the files that could select the pattern with a *nix wildcard, and loops the list.

The Answer 7

7 people think this answer is useful
if os.path.exists(filename): os.remove(filename)

is a one-liner.

Many of you may disagree – possibly for reasons like considering the proposed use of ternaries “ugly” – but this begs the question of whether we should listen to people used to ugly standards when they call something non-standard “ugly”.

The Answer 8

7 people think this answer is useful

Matt’s answer is the right one for older Pythons and Kevin’s the right answer for newer ones.

If you wish not to copy the function for silentremove, this functionality is exposed in path.py as remove_p:

from path import Path
Path(filename).remove_p()

The Answer 9

3 people think this answer is useful

In Python 3.4 or later version, the pythonic way would be:

import os
from contextlib import suppress

with suppress(OSError):
    os.remove(filename)

The Answer 10

1 people think this answer is useful

Something like this? Takes advantage of short-circuit evaluation. If the file does not exist, the whole conditional cannot be true, so python will not bother evaluation the second part.

os.path.exists("gogogo.php") and os.remove("gogogo.php")

The Answer 11

0 people think this answer is useful

A KISS offering:

def remove_if_exists(filename):
  if os.path.exists(filename):
    os.remove(filename)

And then:

remove_if_exists("my.file")

The Answer 12

0 people think this answer is useful

This is another solution:

if os.path.isfile(os.path.join(path, filename)):
    os.remove(os.path.join(path, filename))

The Answer 13

-1 people think this answer is useful

Another solution with your own message in exception.

import os

try:
    os.remove(filename)
except:
    print("Not able to delete the file %s" % filename)

Tags:

Add a Comment