如何使用glob.glob模块搜索子文件夹?

165 投票
13 回答
313592 浏览
提问于 2025-04-17 15:24

我想打开一个文件夹里的几个子文件夹,找到一些文本文件,然后打印这些文本文件中的某些行。我现在用的是这个:

configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')

但是这样做无法访问子文件夹。有没有人知道我该怎么做,才能用同样的命令访问子文件夹呢?

13 个回答

27

要查找直接子目录中的文件,可以使用以下代码:

configfiles = glob.glob(r'C:\Users\sam\Desktop\*\*.txt')

如果你想要一个可以遍历所有子目录的版本,可以使用 ** 并设置 recursive=True,这个功能从 Python 3.5 开始就可以用了,具体可以查看 官方文档

configfiles = glob.glob(r'C:\Users\sam\Desktop\**\*.txt', recursive=True)

这两种方法都会返回一个列表。你也可以使用 glob.iglob() 来逐个返回文件路径。或者可以 使用 pathlib

from pathlib import Path

path = Path(r'C:\Users\sam\Desktop')
txt_files_only_subdirs = path.glob('*/*.txt')
txt_files_all_recursively = path.rglob('*.txt') # including the current dir

这两种方法返回的是迭代器(你可以一个一个地获取路径)。

86

这个话题让很多人感到困惑。让我来帮你理清一下(以Python 3.7为例):

  1. glob.glob('*.txt') :会找到当前文件夹里所有以'.txt'结尾的文件
  2. glob.glob('*/*.txt') :和第一条一样
  3. glob.glob('**/*.txt') :只会找到所有在直接子文件夹里以'.txt'结尾的文件,但不会找到当前文件夹里的文件
  4. glob.glob('*.txt',recursive=True) :和第一条一样
  5. glob.glob('*/*.txt',recursive=True) :和第三条一样
  6. glob.glob('**/*.txt',recursive=True):会找到当前文件夹和所有子文件夹里所有以'.txt'结尾的文件

所以最好总是指定 recursive=True.

251

在Python 3.5及更新版本中,可以使用新的递归功能**/

configfiles = glob.glob('C:/Users/sam/Desktop/file1/**/*.txt', recursive=True)

当设置recursive时,**后面跟着路径分隔符可以匹配0个或多个子目录。

在早期的Python版本中,glob.glob()无法递归地列出子目录中的文件。

在这种情况下,我会使用os.walk(),再结合fnmatch.filter()来实现:

import os
import fnmatch

path = 'C:/Users/sam/Desktop/file1'

configfiles = [os.path.join(dirpath, f)
    for dirpath, dirnames, files in os.walk(path)
    for f in fnmatch.filter(files, '*.txt')]

这样可以递归地遍历你的目录,并返回所有匹配的.txt文件的绝对路径。在这个特定的情况下,fnmatch.filter()可能有点多余,你也可以使用.endswith()来进行测试:

import os

path = 'C:/Users/sam/Desktop/file1'

configfiles = [os.path.join(dirpath, f)
    for dirpath, dirnames, files in os.walk(path)
    for f in files if f.endswith('.txt')]

撰写回答