如何使用 fnmatch 检查字符串特定位置的模式?

How to use fnmatch to check pattern at specific position of string?

我有一个文件夹(称之为 F),其子文件夹的名称格式为 yyyy.doy(例如 2020.001 表示 2020 年一月一日)。在每个子文件夹中是多个仪器的文件。每个文件在第 16、17 和 18 个字符中指定它用于哪个仪器(仪器 1 的文件将有一个文件为 xxxxxxxxxxxxxxx001xxxxx)。我正在尝试使用 python 脚本为每个乐器创建文件名和路径列表。

如果我只查看我可以使用的子文件夹之一:

filelist=[]
for name in glob.glob('2020.001/*.001*'):
    print(name)
    filelist.append(name)

第一台仪器。但是,我想搜索所有子文件夹。根据我在网上找到的内容,我无法使用 glob 的递归子文件夹搜索来执行此操作,因为我的 python 版本是 2.7。我想做的是在下面的格式中使用 fnmatch(从另一个堆栈溢出页面复制过来),但专门搜索第 16、17 和 18 个字符。

filelist = [os.path.join(dirpath, f)
for dirpath, dirnames, files in os.walk(folderpath)
    for f in fnmatch.filter(files, [16:19]=='.001')]

此代码的最后一部分 (files, [16:19]=='.001') 似乎在语法上失败。谁能帮我重新格式化上面的代码或建议更好的方法来创建我的列表?请记住,列表需要包含每个文件的完整文件路径和名称,但要包含单独的工具。

您不需要 fnmatch.filter 来执行此操作,只需要一个相对基本的 Python os.path 实用程序来拆分文件名和文件扩展名,以及一个条件 generator expression.

这就是我的意思。

import os

dirpath = './instrument_files'

for dirpath, dirnames, files in os.walk(dirpath):
    for f in (file for file in files 
                if os.path.splitext(file)[1].startswith('.001')):
        print(f)