如何使用glob.glob模块搜索子文件夹?
我想打开一个文件夹里的几个子文件夹,找到一些文本文件,然后打印这些文本文件中的某些行。我现在用的是这个:
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为例):
glob.glob('*.txt') :
会找到当前文件夹里所有以'.txt'结尾的文件glob.glob('*/*.txt') :
和第一条一样glob.glob('**/*.txt') :
只会找到所有在直接子文件夹里以'.txt'结尾的文件,但不会找到当前文件夹里的文件glob.glob('*.txt',recursive=True) :
和第一条一样glob.glob('*/*.txt',recursive=True) :
和第三条一样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')]