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?
This question is related to
python
A KISS offering:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
And then:
remove_if_exists("my.file")
This is another solution:
if os.path.isfile(os.path.join(path, filename)):
os.remove(os.path.join(path, filename))
Another solution with your own message in exception.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
In the spirit of Andy Jones' answer, how about an authentic ternary operation:
os.remove(fn) if os.path.exists(fn) else None
In Python 3.4 or later version, the pythonic way would be:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
os.path.exists
returns True
for folders as well as files. Consider using os.path.isfile
to check for whether the file exists instead.
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()
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.
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".
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.
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()
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")
Source: Stackoverflow.com