6

Unix 文件名通配符如何在Python中工作?

给定目录仅包含子目录,在每个子目录中(除其他外)有一个文件,其名称以已知字符串结尾,例如_ext. 文件名的第一部分总是变化的,所以我需要使用这种模式来获取文件。

我想这样做:

directory = "."
listofSubDirs = [x[0] for x in os.walk(directory)]
listofSubDirs = listofSubDirs[1:] #removing "."

for subDirectory in listofSubDirs:
    fileNameToPickle = subDirectory + "/*_ext" #only one such file exists
    fileToPickle = pickle.load(open(fileNameToPickle, "rb"))
    ... do stuff ...

但是没有发生模式匹配。它在 Python 下是如何工作的?

4

1 回答 1

10

Shell 通配符模式在 Python 中不起作用。请改用fnmatchorglob模块来解释通配符。fnmatch解释通配符并让您匹配字符串,在内部glob使用fnmatch,以及os.listdir()为您提供匹配文件名的列表。

在这种情况下,我会使用fnmatch.filter()

import os
import fnmatch

for dirpath, dirnames, files in os.walk(directory):
    for filename in fnmatch.filter(files, '*_ext'):
        fileNameToPickle = os.path.join(dirpath, filename)
        fileToPickle = pickle.load(open(fileNameToPickle, "rb"))

如果您的结构仅包含一层子目录,您还可以使用一种glob()模式来表达这一点;表达式路径*/中的扩展为匹配所有子目录:

import glob
import os

for filename in glob.glob(os.path.join(directory, '*/*_ext')):
    # loops over matching filenames in all subdirectories of `directory`.
于 2013-04-11T13:13:14.637 回答