精炼fnmatch模式以获得更具体的结果

时间:2014-07-01 16:36:24

标签: python python-2.7

来自MATLAB的全新Python。基本上没有UNIX或regexp知识。

我有一些处理数据分类到文件夹中。我想获取要处理的文件列表,因此我提示输入顶级文件夹并搜索该文件夹和子文件夹中的所有内容以进行匹配。在Python的文档和各种各样的东西之间我已经在那里得到了大部分内容:

from Tkinter import Tk
import tkFileDialog
import os
import fnmatch

def recursivedecodeprompt():
    root = Tk()
    root.withdraw()
    toplevel = tkFileDialog.askdirectory(title='Select Top Level Directory')

    filelist = []
    for root, dirnames, filenames in os.walk(toplevel):
        for filename in fnmatch.filter(filenames, 'LOG.*'):
            filelist.append(os.path.join(root, filename))

    return filelist

我的问题与模式字符串有关。我的文件夹中可能只有LOG.001个文件,或者他们可能有LOG.001LOG.001.csvLOG.001.gps等,我当前的模式也匹配。我以为我可以聪明并使用'LOG.???'但它会返回相同的列表。

是否有一种简单的方法可以让fnmatch忽略3位数字后附加任何内容的文件?是否有更合适的工具?

半相关的问题:是否有办法允许tkFileDialog.askdirectory()对话框可调整大小?

编辑:为了澄清,文件名的数字部分可以改变,所以我可以LOG.001LOG.002LOG.003等。我希望它不那么烦人命名约定,但它是如何从设备中产生的。

2 个答案:

答案 0 :(得分:3)

使用re:

filnames = ["LOG.001","LOG.002","LOG.001.csv","LOG.003.csv","LOG.1002"]
print [x for x in filnames if re.search("LOG.\d+$",x)]

['LOG.001', 'LOG.002', 'LOG.1002']

答案 1 :(得分:2)

根据您的说法,似乎只有有效的文件名正好是七个字符长。所以最简单的方法似乎是包含

if len(filename) != 7:
    continue

作为循环的第一行。这将终止当前循环迭代,除非文件名确实长达7个字符。不需要正则表达式!