python - 按日期顺序过滤字符串列表,其中日期是字符串的一部分
问题描述
我创建了一个格式为 xxxx_2019-05-20.txt 的文件名列表,其中包含目录中的所有文件。我使用 os.listdir('path') 来构建列表。
我想创建第二个列表,仅包含 2019-01-01 之后的文件。
有没有一种方法可以做到这一点,而无需遍历每个文件名并从文件名中提取日期并将其与 filterdate (2019-01-01) 进行比较?
我可以做到以上,唯一的问题是我可以查看非常大的目录,所以只是想知道是否有更聪明的方法来做到这一点。谢谢您的帮助。
解决方案
我不认为时间在这里会成为问题。我用一百万个假文件名构建了一个工作流程,它对我来说工作约 2.5 秒(我有一台普通的计算机)。此外,我使用正则表达式进行年份提取,因此如果您想要更简单的解决方案,它会更快。
import timeit
s="""from random import choice
import re
names = ('WAKA', 'waka', 'waka-waka', 'wattafak')
dates = ('2018-12-01', '2018-01-01', '2019-01-01', '2019-02-03')
filenames = (
choice(names) + '_' + choice(dates) + '.txt'
for _ in range(1000000)
)
def check_filenames_regex(filenames):
REGEX = re.compile(r'.*_(?P<year>\d{4})-\d\d-\d\d\..+')
result = []
for f in filenames:
r = REGEX.match(f)
if r:
year = r.group('year')
if int(year) >= 2019:
result.append(f)
return result
"""
timeit.timeit('check_filenames_regex(filenames)', setup=s)
返回:
2.742631300352514
如果您的文件夹少于数千万个文件,那么简单的暴力解决方案应该不是问题。
推荐阅读
- angular - Angular 7 和 HTML 选择问题
- java - 如何选择下拉值
- php - 这是在 php 类中使用准备好的语句的不安全方式吗?
- sass - 如何将 mat-tab-group 标签左对齐
- c# - LuisRecognizer 结果在 DateTimeV2 分辨率 Json 中不显示“Value”字段
- jsf - primefaces 微调器的 ValueChangeEvent 为空
- python - 搜索正则表达式时忽略子节点
- javascript - 使用 jquery 或 javascript 运行浏览器工具栏按钮
- powershell - 如何阻止电子邮件签名通过
- ios - 为什么频繁切换CALayer的隐藏属性会导致图形极度退化?