根据包含时间戳的文件名获取时间范围内的文件列表

问题描述 投票:0回答:1

具有以下结构的简化 python 项目

包含许多文件,其名称使用以下格式对时间戳进行编码

MMDDYYYY_HHMMSS

例如,第一个文件的名称包含时间戳 May 11th, 2023, 08:01:34.

我需要的是一个带签名的函数

def get_files_between(starttime,endtime):

返回开始时间和结束时间之间的所有文件名,其中开始时间和结束时间以小时和分钟给出。

例如,

get_files_between("0801","0802")

应该回来

['f_sometext_05112023_080134.csv','f_sometext_05112023_080155.csv','f_sometext_05112023_080218.csv','f_sometext_05112023_080225.csv']

对于像 08:01 这样的一分钟间隔,使用 glob 实现类似的东西真的很容易:

import glob
files = glob.glob(pathname="Files/f_*_*_0801*.csv")
print(files)

如何将此代码推广到包含几分钟的时间间隔?

python glob
1个回答
1
投票

我会这样做:

from pathlib import Path
​
def get_files_between(starttime, endtime):
​
    out = [f.name for hm in [starttime, endtime] #`hm` for hour-minute
           for f in Path("Files").glob(f"f_*_{hm}*.csv")] #adjust the pattern if needed
​
    return out

输出:

get_files_between("0801", "0802")
​
['f_sometext_05112023_080134.csv',
 'f_sometext_05112023_080155.csv',
 'f_sometext_05112023_080218.csv',
 'f_sometext_05112023_080225.csv']

更稳健的方法是使用

timedelta
:

from datetime import datetime, timedelta

def get_files_between(starttime, endtime):
    s, e = datetime.strptime(starttime, "%H%M"), datetime.strptime(endtime, "%H%M")

    hmins = [(s + timedelta(minutes=i)).strftime("%H%M")
            for i in range((e-s).seconds//60+1)]
    
    out = [f.name for hm in hmins for f in Path("Files").glob(f"f_*_{hm}*.csv")]

    return out

输出:

get_files_between("0800", "0802")

['f_sometext_05112023_080001.csv',
 'f_sometext_05112023_080134.csv', # <-- not retrieved by the 1st approach!
 'f_sometext_05112023_080155.csv', # <-- not retrieved by the 1st approach!
 'f_sometext_05112023_080218.csv',
 'f_sometext_05112023_080225.csv']

使用的树:

Files
┣━━ f_sometext_05112023_080001.csv # <-- added by me to test the `timedelta` approach
┣━━ f_sometext_05112023_080134.csv
┣━━ f_sometext_05112023_080155.csv
┣━━ f_sometext_05112023_080218.csv
┣━━ f_sometext_05112023_080225.csv
┣━━ f_sometext_05112023_080323.csv
┗━━ f_sometext_05112023_080455.csv
© www.soinside.com 2019 - 2024. All rights reserved.