关于python:按日期顺序搜索文件?

Glob search files in date order?

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

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

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

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

这个问题是针对php提出的,但我不确定两者之间的区别。

谢谢


按日期对文件排序:

1
2
3
4
5
6
7
import glob
import os

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

另请参见如何排序。


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

"返回一个列表,其中包含路径所给目录中的条目名称。列表的顺序是任意的。它不包括特殊条目"."和"..",即使它们在目录中也存在。

所以你真的很幸运能把它整理好。你需要自己整理。

这对我很有用:

1
2
3
4
5
6
7
8
9
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


如果您的路径是按可排序顺序排列的,那么您总是可以将它们作为字符串进行排序(正如其他人在其答案中已经提到的那样)。

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

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

从模块的测试用例中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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)


基本上与@jfs相同,但在一条线上使用sorted

1
2
import os,glob
searchedfiles = sorted(glob.glob("*cycle*.log"), key=os.path.getmtime)

您可以使用os.path.getmtimeos.path.getctime对返回的文件列表进行排序。看看这另一个,回答并注意评论。


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