我想要具有特定模式的目录中的最新文件。我可以找到最新的文件,但不知道如何包含模式。请尝试提出仅涉及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'结尾的最新文件。请提出建议。
答案 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)