首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅打开文件名中包含过去七天日期的文件

仅打开文件名中包含过去七天日期的文件
EN

Stack Overflow用户
提问于 2021-04-13 01:26:43
回答 2查看 77关注 0票数 2

我有一个包含子目录的目录,所有的子目录都包含具有以下名称结构的文件:

代码语言:javascript
复制
daily_report_yyy-mm-dd.csv

其中yyyy-mm-dd是自2020年初以来的日期,频率为1(天)。

在一个项目中,我只需要引用过去七天的文件,因此我认为读取所有文件然后对结果数据帧进行切片是没有用的。此脚本执行jsut,读取所有文件并将它们连接到onle单个df中

代码语言:javascript
复制
path = path_to_downloads
extension = '.csv'
files_w_path =[]
for root, dirs_list, files_list in os.walk(path):
    for file_name in files_list:
        if os.path.splitext(file_name)[-1] == extension:
            file_name_path = os.path.join(root, file_name)
            files_w_path.append(file_name_path)

df = []
for filename in files_w_path:
    df.append(pd.read_csv(filename))
vehicle = pd.concat(df, ignore_index=True)

现在,我想使用脚本执行的日期,并查找包含该日期的所有文件作为名称的一部分,以及该日期之前的所有七天。我已经考虑过使用下面的代码,但我不知道如何继续。

代码语言:javascript
复制
base = datetime.date.today()

list_of_files =[]
for date in pd.date_range(base, base-7, freq='D').strftime('%Y-%m-%d'):
    for file_name in files[files.str.contains(date)]:
        list_of_files.append(filename)

任何指导都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-13 02:21:43

为了使其健壮,您应该利用内置的datetime库,并使用re对文件名进行模式匹配。如果某些内容与预期的模式不匹配,则可以打印文件名并进一步调查。下面的函数应该会给你想要的东西。

代码语言:javascript
复制
import datetime
import os
import re

pattern = re.compile(r"(?<=daily_report_)[0-9-]+(?=\.csv)")

def valid_files(path):
    delta = datetime.timedelta(days=7)
    now = datetime.date.today()
    threshold = now - delta
    output = []

    for _, _, files in os.walk(path):
        for fin in files:
            if fin.endswith(".csv"):
                try:
                    ts = ts_parser(fin)
                # catch regex and date parsing errors
                except (IndexError, ValueError):
                    print(f"{fin} does not match the pattern")
                    continue
                if ts >= threshold:
                    output.append(fin)
    
    return output


def ts_parser(fname):
    matched = pattern.search(fname).group(0)
    ts = datetime.datetime.date(
        datetime.datetime.strptime(matched, "%Y-%m-%d")
    )
    return ts

假设我有一个具有以下结构的目录。

代码语言:javascript
复制
so/
├── daily_report_2020-09-21.csv
├── daily_report_2021-04-04.csv
├── daily_report_2021-04-05.csv
├── daily_report_2021-04-06.csv
├── daily_report_2021-04-12.csv

当我运行如下所示的函数时,我们得到了想要的结果。

代码语言:javascript
复制
valid_files("./so/")
>> ['daily_report_2021-04-06.csv',
    'daily_report_2021-04-12.csv',
    'daily_report_2021-04-05.csv']
票数 1
EN

Stack Overflow用户

发布于 2021-04-13 02:34:16

我还使用regex和pathlib库实现了答案。

代码语言:javascript
复制
from pathlib import Path
from datetime import datetime, timedelta
import re
regex = re.compile(".{1,}\\d{4,4}\\-(0{0,1}[1-9]|1[012])\\-(0{0,1}[1-9]|[12][0-9]|3[01])$")

path = Path('.')

result = []
delta = timedelta(days=7)
for csv_file in path.glob("**/*.csv"):
    matchArray = regex.findall(csv_file.stem)
    if len(matchArray)> 0:
        file_date = datetime.strptime(csv_file.stem[-10:], '%Y-%m-%d')
        if file_date.date() > datetime.now().date() - delta:
            result.append(csv_file.absolute()) # if you need relative path use result.append(csv_file)

print(result)

您可以在路径构造函数- Path()中指定路径。

代码语言:javascript
复制
Path('.') means the path of the current working directory where the python is located.

现在,从目录和所有子目录中提取所有CSV文件。

代码语言:javascript
复制
path.glob('**/*.csv')-

它将返回生成器对象。因此,如果您有大量的CSV文件,则速度会很快。使用正则表达式匹配您在上面指定的文件模式,并且只处理过滤后的CSV文件。然后,我使用timedelta函数来检查最新的文件。最后,将结果附加到列表结果中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67062958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档