views:

73

answers:

4

Is it possible to see files with certain extensions with the os.listdir command? I want it to work so it may show only files or folders with .f at the end. I checked the documentation, and found nothing, so don't ask.

+1  A: 

Don't ask what?

[s in os.listdir() if s.endswith('.f')]

If you want to check a list of extensions, you could make the obvious generalization,

[s in os.listdir() if s.endswith('.f') or s.endswith('.c') or s.endswith('.z')]

or this other way is a little shorter to write:

[s in os.listdir() if s.rpartition('.')[2] in ('f','c','z')]
David Zaslavsky
There are a lot of things that are explicit function calls in other languages that are replaced by built-in operations in Python. It's tricky keeping track sometimes. For example, the various adapter templates in C++ standard library are simply `lambda` in Python. It's one of my favorite things about Python.
Mike DeSimone
"Don't ask" means "don't ask me, 'did you check the documentation, what did it say?'"
Ned Batchelder
@Ned: I kind of figured that, it was a half-rhetorical question.
David Zaslavsky
+8  A: 

glob is good at this:

import glob
for f in glob.glob("*.f"):
    print f
Ned Batchelder
+1 good idea, that hadn't occurred to me.
David Zaslavsky
+1 wow, that helped a lot! But cant we just do print(glob.glob("*.py")) ?
Galilsnap
You can do that, glob.glob returns a list, do what you want with it.
Ned Batchelder
A: 
[s for s in os.listdir() if os.path.splitext(s) == 'f']
Passi
This should be `os.path.splitext(s)[1] == '.f'`.
Philipp
+1  A: 

There is another possibility not mentioned so far:

import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.f'):
        print file

Actually this is how the glob module is implemented, so in this case glob is simpler and better, but the fnmatch module can be handy in other situations, e.g. when doing a tree traversal using os.walk.

Philipp