Python 如何使用fnmatch检查字符串特定位置的图案?

Python 如何使用fnmatch检查字符串特定位置的图案?,python,python-2.7,fnmatch,Python,Python 2.7,Fnmatch,我有一个文件夹(称之为F),其中的子文件夹的名称格式为yyyy.doy(例如2020年1月1日的2020.001)。每个子文件夹中都有多个仪器的文件。每个文件都以第16、17和18个字符指定它用于哪个仪器(仪器1的文件将有一个文件XXXXXXXXXXXXXXXXXXXX 001XXXXX)。我试图使用python脚本为每个工具创建文件名和路径列表 如果我只查看其中一个子文件夹,我可以使用: filelist=[] for name in glob.glob('2020.001/*.001*'):

我有一个文件夹(称之为
F
),其中的子文件夹的名称格式为yyyy.doy(例如2020年1月1日的2020.001)。每个子文件夹中都有多个仪器的文件。每个文件都以第16、17和18个字符指定它用于哪个仪器(仪器1的文件将有一个文件XXXXXXXXXXXXXXXXXXXX 001XXXXX)。我试图使用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')]

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

您不需要使用
fnmatch.filter
来完成此操作,只需使用一个相对基本的Python
os.path
实用程序将文件名与文件扩展名分开,并使用一个条件值

这就是我的意思

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)

我假设在上面的答案中,“dirpath”指的是我在初始问题中描述的F文件夹。“dirnames”指子文件夹,“files”指每个文件的单独文件名。我看到“os.psth.splitext(file)[1]”将为我提供要与startswith()中的字符串进行比较的扩展名,但标识我的乐器的0010020030405或006不是文件的扩展名,而是24个字符文件名的16、17和18个字符(24个包括扩展名)。你能进一步解释一下我如何使用它来检查我需要的特定字符吗?mperrotta913:fnmatch模块不支持可以做你想做的事情的模式-你不能指定字符位置。我假设您在问题中的
.001
表示以字符
001
开头的文件扩展名(因为前面的
)。请澄清文件名的外观,也许我可以为
fnmatch
限制提供不同的解决方法。感谢您的帮助,我意识到我可以将dirpath所有子文件夹中的所有文件及其路径读取到一个列表中,然后按指定的字符过滤该列表。它为脚本增加了一些时间,但与排序后从文件中读取变量所需的时间相比,没有增加任何时间。