Use a Glob() to find files recursively in Python?
This is what I have:
glob(os.path.join('src','*.c'))
but I want to search the subfolders of src. Something like this would work:
glob(os.path.join('src','*.c'))
glob(os.path.join('src','*','*.c'))
glob(os.path.join('src','*','*','*.c'))
glob(os.path.join('src','*','*','*','*.c'))
But this is obviously limited and clunky.
Python 3.5+
Starting with Python version 3.5, the glob
module supports the "**"
directive (which is parsed only if you pass recursive
flag):
import glob
for filename in glob.iglob('src/**/*.c', recursive=True):
print(filename)
If you need a list, just use glob.glob
instead of glob.iglob
.
For cases where matching files beginning with a dot (.); like files in the current directory or hidden files on Unix based system, use the os.walk
solution below.
Python 2.2 to 3.4
For older Python versions, starting with Python 2.2, use os.walk
to recursively walk a directory and fnmatch.filter
to match against a simple expression:
import fnmatch
import os
matches = []
for root, dirnames, filenames in os.walk('src'):
for filename in fnmatch.filter(filenames, '*.c'):
matches.append(os.path.join(root, filename))
Python 2.1 and earlier
For even older Python versions, use glob.glob
against each filename instead of fnmatch.filter
.
Similar to other solutions, but using fnmatch.fnmatch instead of glob, since os.walk already listed the filenames:
import os, fnmatch
def find_files(directory, pattern):
for root, dirs, files in os.walk(directory):
for basename in files:
if fnmatch.fnmatch(basename, pattern):
filename = os.path.join(root, basename)
yield filename
for filename in find_files('src', '*.c'):
print 'Found C source:', filename
Also, using a generator alows you to process each file as it is found, instead of finding all the files and then processing them.
I've modified the glob module to support ** for recursive globbing, eg:
>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')
https://github.com/miracle2k/python-glob2/
Useful when you want to provide your users with the ability to use the ** syntax, and thus os.walk() alone is not good enough.
链接地址: http://www.djcxy.com/p/20060.html上一篇: 保存npm install的选项?