Искать файлы в Glob по дате?

У меня есть эта строка кода в моем скрипте Python. Он ищет во всех файлах в определенном каталоге * cycle * .log.

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

Это работает отлично, однако, когда я запускаю свой скрипт в сетевом местоположении, он не ищет их по порядку, а вместо этого ищет случайным образом.

Есть ли способ заставить код искать по дате?

Этот вопрос был задан для php, но я не уверен в различиях.

Спасибо


person Jason Rogers    schedule 02.05.2014    source источник
comment
связанные: Сортировка файлов по дате   -  person jfs    schedule 02.05.2014
comment
comment
Окончательный код: searchedfiles = glob.glob("*cycle*.log") searchedfiles.sort(key=os.path.getmtime) for searchedfile in searchedfiles:   -  person Jason Rogers    schedule 02.05.2014


Ответы (6)


Чтобы отсортировать файлы по дате:

import glob
import os

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

См. Также Сортировка КАК.

person jfs    schedule 02.05.2014
comment
Отлично, это сработало с небольшой настройкой, чтобы соответствовать моим потребностям. Для чего нужен ключ =? - person Jason Rogers; 02.05.2014
comment
ах! хороший :) - person Pedro Lobito; 03.05.2020

По сути, то же самое, что и @jfs, но в одной строке с использованием sorted

import os,glob
searchedfiles = sorted(glob.glob("*cycle*.log"), key=os.path.getmtime)
person Pablo Reyes    schedule 07.03.2018

Хорошо. Ответ - нет. glob использует _ 2_, который описывается следующим образом:

"Вернуть список, содержащий имена записей в каталоге, заданном путем. Список находится в произвольном порядке. Он не включает специальные записи '.' и '..', даже если они есть в каталоге. "

Так что вам на самом деле повезло, что вы все разобрали. Вам нужно самому рассортировать.

Это работает для меня:

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.

person luk32    schedule 02.05.2014

Используя glob no. Прямо сейчас, когда вы его используете, glob хранит все файлы одновременно в коде и не имеет методов для организации этих файлов. Если важен только конечный результат, вы можете использовать второй цикл, который проверяет дату файла и на ее основе выполняет обработку. Если порядок синтаксического анализа имеет значение, glob, вероятно, не лучший способ сделать это.

person Dylan Lawrence    schedule 02.05.2014
comment
glob хранит все файлы одновременно в коде, что? - person luk32; 02.05.2014
comment
@ luk32 Код glob.glob () загружает весь набор файлов каталога в какую-то структуру данных. Я сказал код, потому что не знаю, используют ли они список или внутренний массив. - person Dylan Lawrence; 02.05.2014
comment
Это все еще не код. Также это не имеет значения. Проблема в том, что они расположены в произвольном порядке, потому что получают их прямо из системы. Это зависит от реализации ядра и драйвера файловой системы. - person luk32; 02.05.2014

Вы можете отсортировать список возвращаемых файлов с помощью os.path.getmtime или os.path.getctime. См. Этот другой ответ SO и также обратите внимание на комментарии.

person Tom    schedule 02.05.2014

Если ваши пути находятся в сортированном порядке, вы всегда можете отсортировать их как строки (как другие уже упоминали в своих ответах).

Однако, если в ваших путях используется формат даты и времени, такой как %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)
person marko.ristin    schedule 25.03.2018