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

Use*_*YmY 96 python filesystems glob fnmatch

我想在文件夹中打开一系列子文件夹,找到一些文本文件并打印一些文本文件行.我用这个:

configfiles = glob.glob('C:/Users/sam/Desktop/file1/*.txt')
Run Code Online (Sandbox Code Playgroud)

但是这也无法访问子文件夹.有谁知道如何使用相同的命令来访问子文件夹?

Mar*_*ers 140

在Python 3.5和更新版本中使用新的递归**/功能:

configfiles = glob.glob('C:/Users/sam/Desktop/file1/**/*.txt', recursive=True)
Run Code Online (Sandbox Code Playgroud)

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')]
Run Code Online (Sandbox Code Playgroud)

这将以递归方式遍历您的目录并将所有绝对路径名返回给匹配的.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')]
Run Code Online (Sandbox Code Playgroud)

  • @ User123:不会递归列出目录*.您列出了所有文本文件*一级深*,但不是在其他子目录中,甚至不是直接在`目录路径`中. (6认同)
  • 我可以看到:**glob.glob('/ path to directory/*/*.txt")**为我工作.这基本上是使用Unix shell规则. (3认同)
  • 这并不完全相关,但是为什么将 `recursive=False` 与 `**/` 功能一起设置不只提供给定文件夹中的文件列表,而是提供其子文件夹中的文件列表? (2认同)

jfs*_*jfs 18

要在直接子目录中查找文件:

configfiles = glob.glob(r'C:\Users\sam\Desktop\*\*.txt')
Run Code Online (Sandbox Code Playgroud)

对于遍历所有子目录的递归版本,您可以使用**并传递recursive=True 自Python 3.5:

configfiles = glob.glob(r'C:\Users\sam\Desktop\**\*.txt', recursive=True)
Run Code Online (Sandbox Code Playgroud)

两个函数调用返回列表.您可以使用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
Run Code Online (Sandbox Code Playgroud)

两种方法都返回迭代器(您可以逐个获取路径).


meg*_*wac 17

glob2包支持通配符和相当快

code = '''
import glob2
glob2.glob("files/*/**")
'''
timeit.timeit(code, number=1)
Run Code Online (Sandbox Code Playgroud)

在我的笔记本电脑上,匹配> 60,000个文件路径大约需要2秒钟.


And*_*ock 8

您可以在Python 2.6中使用Formic

import formic
fileset = formic.FileSet(include="**/*.txt", directory="C:/Users/sam/Desktop/")
Run Code Online (Sandbox Code Playgroud)

披露 - 我是这个包的作者.


ger*_*erm 6

在这个话题上有很多困惑。让我看看是否可以澄清它(Python 3.7):

  1. glob.glob('*.txt') :匹配当前目录中所有以“ .txt”结尾的文件
  2. glob.glob('*/*.txt') :与1相同
  3. glob.glob('**/*.txt') :仅匹配直接子目录中所有以'.txt'结尾的文件,而不匹配当前目录中的所有文件
  4. glob.glob('*.txt',recursive=True) :与1相同
  5. glob.glob('*/*.txt',recursive=True) :与3相同
  6. glob.glob('**/*.txt',recursive=True):匹配当前目录和所有子目录中所有以“ .txt”结尾的文件

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

  • 我不确定情况3是否正确。我尝试使用 pathlib.Path.glob ,该模式返回与情况 6 相同的结果。(所有 txt 文件递归)。这也是当前最喜欢的答案提到的(/sf/answers/1035878441/) (2认同)