6

How do Unix filename wildcards work from Python?

A given directory contains only subdirectories, in each of which there is (among others) one file whose name ends with a known string, say _ext. The first part of the filename always varies, so I need to get to the file by using this pattern.

I wanted to do this:

directory = "."
listofSubDirs = [x[0] for x in os.walk(directory)]
listofSubDirs = listofSubDirs[1:] #removing "."

for subDirectory in listofSubDirs:
    fileNameToPickle = subDirectory + "/*_ext" #only one such file exists
    fileToPickle = pickle.load(open(fileNameToPickle, "rb"))
    ... do stuff ...

But no pattern matching happens. How does it work under Python?

2
  • 4
    glob.glob('*_ext') supports wildcards. Commented Apr 11, 2013 at 13:12
  • You should indeed use glob: docs.python.org/2/library/glob.html Commented Apr 11, 2013 at 13:13

1 Answer 1

10

Shell wildcard patterns don't work in Python. Use the fnmatch or glob modules to interpret the wildcards instead. fnmatch interprets wildcards and lets you match strings against them, glob uses fnmatch internally, together with os.listdir() to give you a list of matching filenames.

In this case, I'd use fnmatch.filter():

import os
import fnmatch

for dirpath, dirnames, files in os.walk(directory):
    for filename in fnmatch.filter(files, '*_ext'):
        fileNameToPickle = os.path.join(dirpath, filename)
        fileToPickle = pickle.load(open(fileNameToPickle, "rb"))

If your structure contains only one level of subdirectories, you could also use a glob() pattern that expresses that; the */ in the path of expression is expanded to match all subdirectories:

import glob
import os

for filename in glob.glob(os.path.join(directory, '*/*_ext')):
    # loops over matching filenames in all subdirectories of `directory`.
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.