Check if a directory contains a file with a given extension
Solution 1
You can use the else
block of the for
:
for fname in os.listdir('.'):
if fname.endswith('.true'):
# do stuff on the file
break
else:
# do stuff if a file .true doesn't exist.
The else
attached to a for
will be run whenever the break
inside the loop is not executed. If you think a for
loop as a way to search something, then break
tells whether you have found that something. The else
is run when you didn't found what you were searching for.
Alternatively:
if not any(fname.endswith('.true') for fname in os.listdir('.')):
# do stuff if a file .true doesn't exist
Moreover you could use the glob
module instead of listdir
:
import glob
# stuff
if not glob.glob('*.true')`:
# do stuff if no file ending in .true exists
Solution 2
If you only want to check that any file ends with a particular extension, use any
.
import os
if any(File.endswith(".true") for File in os.listdir(".")):
print("true")
else:
print("false")
Solution 3
You should use the glob
module to look for exactly the files that you're interested in:
import glob
fileList = glob.glob("*.true")
for trueFile in fileList:
doSomethingWithFile(trueFile)
Solution 4
Similar to @bgporter's solution, you could also use Path to do something similar:
import Path
cwd = Path.cwd()
for path in cwd.glob("*.true"):
print("true")
DoSomething(path)
Related videos on Youtube
![Jacob Birkett](https://i.stack.imgur.com/s0bxH.jpg?s=256&g=1)
Jacob Birkett
Working at a software company in the NL. Currently playing with the Rust language in my free time.
Updated on July 09, 2022Comments
-
Jacob Birkett almost 2 years
I need to check the current directory and see if a file with an extension exists. My setup will (usually) only have one file with this extension. I need to check if that file exists, and if it does, run a command.
However, it runs the
else
multiple times because there are multiple files with alternate extensions. It must only run theelse
if the file does not exist, not once for every other file. My code sample is below.
The directory is structured like so:
dir_________________________________________ \ \ \ \ file.false file.false file.true file.false
When I run:
import os for File in os.listdir("."): if File.endswith(".true"): print("true") else: print("false")
The output is:
false false true false
The issue with this is if I replaced
print("false")
with something useful, it will run it multiple times.Edit: I asked this question 2 years ago, and it's still seeing very mild activity, therefore, I'd like to leave this here for other people: http://book.pythontips.com/en/latest/for_-_else.html#else-clause
-
Sylvain about 4 yearswith the new pathlib library, you can change glob to
if not list(pathlib.Path(".").rglob("*.true"))