按日期顺序搜索Glob?

时间:2014-05-02 14:21:19

标签: python date search glob

我的python脚本中有这行代码。它搜索特定目录中的所有文件以查找* cycle * .log。

for searchedfile in glob.glob("*cycle*.log"):

这非常有效,但是当我将脚本运行到网络位置时,它不会按顺序搜索它们,而是随机搜索。

有没有办法强制代码按日期顺序搜索?

这个问题已经被问到了php,但我不确定这些差异。

由于

6 个答案:

答案 0 :(得分:49)

按日期排序文件:

import glob
import os

files = glob.glob("*cycle*.log")
files.sort(key=os.path.getmtime)
print("\n".join(files))

另见Sorting HOW TO

答案 1 :(得分:4)

好。答案是否定的。 glob使用os.listdir,其描述如下:

返回一个列表,其中包含path给出的目录中的条目名称。列表按任意顺序排列。它不包含特殊条目'。'和'..'即使它们出现在目录中。

所以你真的很幸运,你把它分类了。你需要自己排序。

这对我有用:

import glob
import os
import time

searchedfile = glob.glob("*.cpp")
files = sorted( searchedfile, key = lambda file: os.path.getctime(file))

for file in files:
 print("{} - {}".format(file, time.ctime(os.path.getctime(file))) )

另请注意,这会使用创建时间,如果要使用修改时间,则使用的函数必须为getmtime

答案 2 :(得分:0)

使用glob no。现在,当您正在使用它时,glob将所有文件同时存储在代码中,并且没有用于组织这些文件的方法。如果只有最终结果很重要,您可以使用第二个循环来检查文件的日期和度假村。如果解析顺序很重要,那么glob可能不是最好的方法。

答案 3 :(得分:0)

您可以使用os.path.getmtimeos.path.getctime对返回的文件列表进行排序。请参阅此其他SO answer并注意评论。

答案 4 :(得分:0)

基本上与@jfs相同,但使用str

在一行中
sorted

答案 5 :(得分:0)

如果您的路径是可排序的,那么您始终可以将它们排序为字符串(正如其他人已在其答案中提到的那样)。

但是,如果您的路径使用类似%d.%m.%Y的日期时间格式,则会更加复杂。由于strptime不支持通配符,因此我们开发了一个模块datetime-glob来解析包含通配符的路径的日期/时间。

使用datetime-glob,您可以遍历树,列出目录,解析日期/时间并将其排序为元组(date/time, path)

从模块的测试用例中:

import pathlib
import tempfile

import datetime_glob

def test_sort_listdir(self):
    with tempfile.TemporaryDirectory() as tempdir:
        pth = pathlib.Path(tempdir)
        (pth / 'some-description-20.3.2016.txt').write_text('tested')
        (pth / 'other-description-7.4.2016.txt').write_text('tested')
        (pth / 'yet-another-description-1.1.2016.txt').write_text('tested')

        matcher = datetime_glob.Matcher(pattern='*%-d.%-m.%Y.txt')
        subpths_matches = [(subpth, matcher.match(subpth.name)) for subpth in pth.iterdir()]
        dtimes_subpths = [(mtch.as_datetime(), subpth) for subpth, mtch in subpths_matches]

        subpths = [subpth for _, subpth in sorted(dtimes_subpths)]

        # yapf: disable
        expected = [
            pth / 'yet-another-description-1.1.2016.txt',
            pth / 'some-description-20.3.2016.txt',
            pth / 'other-description-7.4.2016.txt'
        ]
        # yapf: enable

        self.assertListEqual(subpths, expected)