python:如何在具有特定模式的目录中获取最新文件

时间:2019-11-22 09:37:36

标签: python

我想要具有特定模式的目录中的最新文件。我可以找到最新的文件,但不知道如何包含模式。请尝试提出仅涉及os库的解决方案。

def newest(DIR_PATH):
    files = os.listdir(DIR_PATH)
    FILE_LIST = [os.path.join(DIR_PATH, BASENAME) for BASENAME in files]
    return max(FILE_LIST, key=os.path.getctime)

目录中包含多种文件。例如,考虑以下两种文件。

xyz-2019-11-17_01-25-14.json
xyz-2019-11-17_01-25-14-trimmed.json

我想获取不以'-trimmed.json'结尾的最新文件。请提出建议。

4 个答案:

答案 0 :(得分:1)

您可能会使用

import os
from pathlib import Path as makePath

def find_youngest(path, pattern, n=1):
    """
    find the file that matches a pattern and has the highest modification
    timestamp if there are multiple files that match the pattern.
    input:
        path, string or pathlib.Path, where to look for the file(s)
        pattern, string, pattern to look for in filename
        n, integer, how many to return. defaults to 1
    returns
        filename(s) of youngest file(s), including path.
        None if no file
    """
    assert n >= 1, "n must be greater equal 1."

    path = makePath(path)
    files = [makePath(f) for f in path.glob(pattern) if os.path.isfile(f)]
    sortfiles = sorted(files, key=lambda x: os.path.getmtime(x), reverse=True)

    if sortfiles:
        return sortfiles[:n]
    return None

注意:如果使用pathlib.Path.glob,还可以使用regex模式进行字符串匹配。

一种基于特定文件名结尾选择文件的简单方法是

files = ['xyz-2019-11-17_01-25-14.json',
         'xyz-2019-11-17_01-25-14-trimmed.json']
select = [f for f in files if not f.endswith('-trimmed.json')]
# select
# Out[35]: ['xyz-2019-11-17_01-25-14.json']

答案 1 :(得分:1)

您可以简单地这样:

def newest(DIR_PATH):
    files = os.listdir(DIR_PATH)
    FILE_LIST = [os.path.join(DIR_PATH, BASENAME) for BASENAME in files if not BASENAME.endswith("trimmed.json")]
    return max(FILE_LIST, key=os.path.getctime)

答案 2 :(得分:0)

有一个名为glob的库。一探究竟。 https://docs.python.org/3/library/glob.html

答案 3 :(得分:0)

该解决方案与“ Florian H”给出的解决方案几乎相同,只是存在一点细微的差别,如果该模式位于文件名之间,且endswith不相关。

def newest(DIR_PATH):
    files = os.listdir(DIR_PATH)
    FILE_LIST = [os.path.join(DIR_PATH, BASENAME) for BASENAME in files if "trimmed" not in BASENAME]
    return max(FILE_LIST, key=os.path.getctime)