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

164

我想打开一个文件夹中的一系列子文件夹,找到一些文本文件并打印出文本文件的某些行。我正在使用以下代码:

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

但这个命令无法访问子文件夹。有人知道如何使用相同的命令来访问子文件夹吗?


1
使用Glob()在Python中递归查找文件 - samkhan13
1
这个回答是否解决了您的问题?如何使用glob()递归查找文件? - Basj
13个回答

1
你可以直接使用 glob 模块中的函数 glob.glob() 或 glob.iglob() 来递归地检索目录/文件和子目录/子文件的路径。
语法:
glob.glob(pathname, *, recursive=False) # pathname = '/path/to/the/directory' or subdirectory
glob.iglob(pathname, *, recursive=False)

在你的示例中,可以这样编写:

import glob
import os

configfiles = [f for f in glob.glob("C:/Users/sam/Desktop/*.txt")]

for f in configfiles:
    print(f'Filename with path: {f}')
    print(f'Only filename: {os.path.basename(f)}')
    print(f'Filename without extensions: {os.path.splitext(os.path.basename(f))[0]}')

输出:

Filename with path: C:/Users/sam/Desktop/test_file.txt
Only filename: test_file.txt
Filename without extensions: test_file

帮助:os.path.splitextos.path.basename文档


0
正如Martijn所指出的那样,glob只能通过Python 3.5中引入的**运算符来实现这一点。由于OP明确要求使用glob模块,因此以下代码将返回一个类似的惰性评估迭代器。
import os, glob, itertools

configfiles = itertools.chain.from_iterable(glob.iglob(os.path.join(root,'*.txt'))
                         for root, dirs, files in os.walk('C:/Users/sam/Desktop/file1/'))

请注意,使用这种方法只能对configfiles进行一次迭代。如果您需要一个真正的配置文件列表,可以在多个操作中使用,您必须通过使用list(configfiles)来显式创建它。

0

rglob 命令将无限递归到您的目录结构的最深子级。如果您只想要一层深度,则不要使用它。

我意识到 OP 正在谈论使用 glob.glob。然而,我相信这个回答解决了意图,即递归搜索所有子文件夹。

rglob 函数最近为一个数据处理算法产生了 100 倍的速度增长,该算法使用文件夹结构作为读取数据顺序的固定假设。但是,使用 rglob,我们能够一次扫描所有位于指定父目录下或以下的文件,将它们的名称保存到列表中(超过一百万个文件),然后仅基于文件命名约定而不是所在文件夹来确定未来任何时刻需要打开哪些文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接