【问题标题】:Filter list of strings by date order where date is part of string按日期顺序过滤字符串列表,其中日期是字符串的一部分
【发布时间】:2019-10-06 20:55:23
【问题描述】:

我创建了一个格式为 xxxx_2019-05-20.txt 的文件名列表,其中包含目录中的所有文件。我使用 os.listdir('path') 来构建列表。

我想创建第二个列表,仅包含 2019-01-01 之后的文件。

有没有一种方法可以做到这一点,而无需遍历每个文件名并从文件名中提取日期并将其与 filterdate (2019-01-01) 进行比较?

我可以做到以上,唯一的问题是我可以查看非常大的目录,所以只是想知道是否有更聪明的方法来做到这一点。感谢您的帮助。

【问题讨论】:

  • 到目前为止你有什么?
  • 我认为您的选择仅限于 (1) 从每个文件名中提取日期,或 (2) 将日期 2019-01-01 放入具有相同前缀的虚假文件名中并进行比较到那里的那个

标签: python


【解决方案1】:

我不认为时间会成为问题。我用一百万个假文件名构建了一个工作流程,它对我来说工作约 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

如果您的文件夹少于数千万个文件,那么简单的暴力解决方案应该不是问题。

【讨论】:

  • 非常感谢您抽出宝贵时间来做这个 vurmux ,它真的很有帮助
猜你喜欢
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-23
  • 1970-01-01
相关资源
最近更新 更多