Question or problem about Python programming:
How do I check if a file exists or not, without using the try statement?
How to solve the problem:
Solution 1:
If the reason you’re checking is so you can do something like if file_exists: open_it(), it’s safer to use a try around the attempt to open it. Checking and then opening risks the file being deleted or moved or something between when you check and when you try to open it.
If you’re not planning to open the file immediately, you can use os.path.isfile
import os.path os.path.isfile(fname)
if you need to be sure it’s a file.
Starting with Python 3.4, the pathlib module offers an object-oriented approach (backported to pathlib2 in Python 2.7):
from pathlib import Path my_file = Path("/path/to/file") if my_file.is_file(): # file exists
To check a directory, do:
if my_file.is_dir(): # directory exists
To check whether a Path object exists independently of whether is it a file or directory, use exists():
if my_file.exists(): # path exists
You can also use resolve(strict=True) in a try block:
try: my_abs_path = my_file.resolve(strict=True) except FileNotFoundError: # doesn't exist else: # exists
Solution 2:
You have the os.path.exists function:
import os.path os.path.exists(file_path)
This returns True for both files and directories but you can instead use
os.path.isfile(file_path)
to test if it’s a file specifically. It follows symlinks.
Solution 3:
Unlike isfile(), exists() will return True for directories. So depending on if you want only plain files or also directories, you’ll use isfile() or exists(). Here is some simple REPL output:
>>> os.path.isfile("/etc/password.txt") True >>> os.path.isfile("/etc") False >>> os.path.isfile("/does/not/exist") False >>> os.path.exists("/etc/password.txt") True >>> os.path.exists("/etc") True >>> os.path.exists("/does/not/exist") False
Solution 4:
import os.path if os.path.isfile(filepath):
Solution 5:
Use os.path.isfile() with os.access():
import os PATH = './file.txt' if os.path.isfile(PATH) and os.access(PATH, os.R_OK): print("File exists and is readable") else: print("Either the file is missing or not readable")