【问题标题】:Refining fnmatch pattern for more specific results优化 fnmatch 模式以获得更具体的结果
【发布时间】:2014-07-02 02:49:55
【问题描述】:

来自 MATLAB 的全新 Python。基本上没有 UNIX 或正则表达式知识。

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

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 位 ID 之后附加任何内容的文件?有没有更适合这项工作的工具?

半相关的附带问题:有没有办法让tkFileDialog.askdirectory() 对话框可以调整大小?

编辑:澄清一下,文件名的数字部分可以并且将会改变,所以我可以有LOG.001LOG.002LOG.003 等。我希望这是一个不那么烦人的命名约定,但就是这样从设备中出来。

【问题讨论】:

  • 尝试使用 re re.findall("LOG.001.*",filenames),从未使用过 fnmatch 但也许可以使用相同的表达式。
  • 我认为re.findall()不能用于列表
  • 遍历列表就可以使用
  • @PadraicCunningham 我希望通过另一个扩展名排除任何内容,所以我只想要 LOG.001LOG.002 等。

标签: python python-2.7


【解决方案1】:

使用回复:

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']

【讨论】:

    【解决方案2】:

    从您所说的看来,只有有效的文件名才恰好是七个字符长。所以最简单的方法似乎是包含

    if len(filename) != 7:
        continue
    

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

    【讨论】:

    • OP 正在寻找以“LOG.001”开头并可以以 .gps、.csv 等结尾的各种日志文件。所以我看不出查找长度与问题。
    • OP 明确表示,只要没有我看不到的“LOG.gps”文件,他就想忽略任何不只是命名为“LOG.NNN”的文件为什么这个解决方案不起作用。投诉似乎是当前正在匹配“Log.NNN.gps”之类的文件名。还是我仍然误解了这个问题?
    • @holdenweb 是的,我误解了这个问题。
    • 我非常同意,但希望在指出替代方案之前让您快速前进。 @Padraic 我自己也经常这样做,不用担心。
    • 啊,其实我看到 Padraic 已经提供了优雅的方式,所以我只是赞成他的回答。
    猜你喜欢
    • 2020-04-25
    • 1970-01-01
    • 2023-03-08
    • 2021-12-06
    • 2022-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多