我的python脚本中有这行代码。它搜索特定目录中的所有文件以查找* cycle * .log。
for searchedfile in glob.glob("*cycle*.log"):
这非常有效,但是当我将脚本运行到网络位置时,它不会按顺序搜索它们,而是随机搜索。
有没有办法强制代码按日期顺序搜索?
这个问题已经被问到了php,但我不确定这些差异。
由于
答案 0 :(得分:49)
按日期排序文件:
import glob
import os
files = glob.glob("*cycle*.log")
files.sort(key=os.path.getmtime)
print("\n".join(files))
答案 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.getmtime
或os.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)