这是我所拥有的:

glob(os.path.join('src','*.c'))

但是我想搜索src的子文件夹。这样做是可行的:

glob(os.path.join('src','*.c'))
glob(os.path.join('src','*','*.c'))
glob(os.path.join('src','*','*','*.c'))
glob(os.path.join('src','*','*','*','*.c'))

但这显然是有限和笨拙的。


当前回答

考虑pathlib.rglob()。

这就像调用Path.glob(),在给定的相对模式前添加“**/”:

import pathlib


for p in pathlib.Path("src").rglob("*.c"):
    print(p)

也可以在这里看到@taleinat的相关帖子和其他地方的类似帖子。

其他回答

你需要使用操作系统。行走以收集符合条件的文件名。例如:

import os
cfiles = []
for root, dirs, files in os.walk('src'):
  for file in files:
    if file.endswith('.c'):
      cfiles.append(os.path.join(root, file))

如果文件位于远程文件系统上或归档文件中,则可以使用fspecabstractfilesystem类的实现。例如,要列出一个zipfile中的所有文件:

from fsspec.implementations.zip import ZipFileSystem
fs = ZipFileSystem("/tmp/test.zip")
fs.glob("/**")  # equivalent: fs.find("/")

或者列出公共S3桶中的所有文件:

from s3fs import S3FileSystem
fs_s3 = S3FileSystem(anon=True)
fs_s3.glob("noaa-goes16/ABI-L1b-RadF/2020/045/**")  # or use fs_s3.find

你也可以将它用于本地文件系统,如果你的实现应该是文件系统不可知的,这可能会很有趣:

from fsspec.implementations.local import LocalFileSystem
fs = LocalFileSystem()
fs.glob("/tmp/test/**")

其他实现包括谷歌云,Github, SFTP/SSH, Dropbox和Azure。具体操作请参见fspec API文档。

最近我不得不恢复我的图片扩展。jpg。我运行photorec,恢复了4579个目录,其中有220万个文件,扩展名种类繁多。使用下面的脚本,我能够在几分钟内选择50133个扩展名为。jpg的文件:

#!/usr/binenv python2.7

import glob
import shutil
import os

src_dir = "/home/mustafa/Masaüstü/yedek"
dst_dir = "/home/mustafa/Genel/media"
for mediafile in glob.iglob(os.path.join(src_dir, "*", "*.jpg")): #"*" is for subdirectory
    shutil.copy(mediafile, dst_dir)

或者使用列表推导式:

 >>> base = r"c:\User\xtofl"
 >>> binfiles = [ os.path.join(base,f) 
            for base, _, files in os.walk(root) 
            for f in files if f.endswith(".jpg") ] 

我修改了glob模块,以支持**的递归配色,例如:

>>> import glob2
>>> all_header_files = glob2.glob('src/**/*.c')

https://github.com/miracle2k/python-glob2/

当你想为你的用户提供使用**语法的能力时很有用,因此os.walk()本身不够好。