【问题标题】:How to use fnmatch to check pattern at specific position of string?如何使用 fnmatch 检查字符串特定位置的模式?
【发布时间】:2021-01-31 10:08:30
【问题描述】:

我有一个文件夹(称为 F),其中包含名称格式为 yyyy.doy 的子文件夹(例如 2020.001 表示 2020 年 1 月 1 日)。每个子文件夹中都有多个仪器的文件。每个文件在第 16、17 和 18 个字符中指定它用于哪个仪器(来自仪器 1 的文件的文件为 xxxxxxxxxxxxxxx001xxxxxx)。我正在尝试使用 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') 的最后一部分似乎在语法上失败了。谁能帮我重新格式化上面的代码或建议一种更好的方法来创建我的列表?请记住,列表需要包含每个文件的完整文件路径和名称,但单独的仪器。

【问题讨论】:

    标签: python python-2.7 fnmatch


    【解决方案1】:

    您不需要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)
    

    【讨论】:

    • 我假设在上面的答案中“dirpath”指的是我在初始问题中描述的 F 文件夹。 “dirnames”是指子文件夹,“files”是每个文件的单独文件名。我看到“os.psth.splitext(file)[1]”会给我与startswith()中的字符串进行比较的扩展名,但是标识我的仪器的001,002,003,004,005或006不是文件的扩展名,而是字符16、17 和 18 个 24 个字符的文件名(24 个包括扩展字符)。你能进一步解释我如何使用它来检查我需要的特定字符吗?
    • mperrotta913:fnmatch 模块不支持可以做你想做的事情的模式——你不能指定字符位置。我假设您在问题中的.001 表示以字符001 开头的文件扩展名(因为前导.)。请澄清文件名的样子,也许我可以为fnmatch 限制提供不同的解决方法。
    • 感谢您的帮助,我意识到我可以将 dirpath 的所有子文件夹中的所有文件及其路径读取到一个列表中,然后按指定字符过滤列表。它为脚本增加了一些时间,但与排序后从文件中读取变量所花费的时间相比没有任何意义。
    猜你喜欢
    • 2016-10-23
    • 2013-12-08
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-08
    相关资源
    最近更新 更多