【问题标题】:how to get list of csv files modified after 2018 using glob?如何使用 glob 获取 2018 年之后修改的 csv 文件列表?
【发布时间】:2021-09-14 16:17:35
【问题描述】:

我有一个包含 10000 个不同扩展名的文件的远程目录。每个文件都是从 2015 年开始创建的。

我只想获取 2018 年之后修改的 CSV 文件。

filter = 2018
files = sorted(Path(directory).iterdir(), key=os.path.getmtime)
final = list()
for file in files:
    if datetime.fromtimestamp(os.path.getmtime(directory/file)) >= datetime(filter, 1, 1):
        final.append(re.search('([a-z]+)([0-9]{4}).csv',file).group(0))

上面的代码效率低下。我列出所有文件,然后检查修改年份,然后检查文件是否为csv

我找到了以下,

from glob import glob
files = glob('*.csv')

这仅列出csv 文件。来自 glob 的正则表达式模式匹配受到限制,因此我决定在使用 glob 列出 csv 文件后使用 re 模块。

有什么方法可以使用 glob 根据年份进行过滤吗?

或者只是常规的 ol' 循环。即,

[f for f in files if datetime.fromtimestamp(os.path.getmtime(directory/f)) >= datetime(filter, 1, 1)]

【问题讨论】:

  • 您的代码并非低效,您将总是必须检查文件...glob 无法避免这种情况,它只是对您隐藏。 您要解决的实际问题是什么? AFAIK glob 不能用于按日期过滤,它基本上是文件系统名称的简单模式匹配
  • @juanpa.arrivillaga 我正在尝试减少浪费的资源,因为我在我的用例中多次运行它(从子目录中获取文件列表)。我列出然后过滤文件效率不高吗?我不应该只请求 CSV 文件而不是所有文件,然后使用 re 模块对其进行过滤吗?修改时间也是如此。

标签: python glob


【解决方案1】:

如果您使用的是 python3,您可以尝试使用 os.scandir。 根据文档

使用 scandir() 代替 listdir() 可以显着提高同样需要文件类型或文件属性信息的代码的性能

import datetime, os
path = "."
cutoff_date = datetime.datetime(2021,9,1).timestamp()
csvfiles = [ f.name for f in os.scandir(path) if f.is_file() 
            and f.stat().st_mtime > cutoff_date and f.name.endswith(".csv") ]

【讨论】:

    猜你喜欢
    • 2016-02-18
    • 2010-10-04
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2019-10-02
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多