【发布时间】: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 模块对其进行过滤吗?修改时间也是如此。