Я пытаюсь получить время последней модификации (os.stat.st_mtime
) конкретного каталога. Моя проблема заключается в том, что я добавил несколько файлов метаданных, которые скрыты (они начинаются с .
). Если я использую os.stat(directory).st_mtime
я получаю дату, когда я обновил файл метаданных, а не дату, когда в каталоге был изменен не скрытый файл. Я хотел бы получить самое последнее время изменения для всех других файлов в каталоге, кроме скрытых файлов метаданных.
Я полагаю, что можно написать свою собственную функцию, что-то вроде:
for file in folder:
if not file starts with '.':
modified_times.append(os.path.getmtime('/path/to/file')
last_time = most recent of modified_times
Однако возможно ли это сделать в python? Или мне нужно написать свою собственную функцию, например, псевдокод (или что-то вроде этого вопроса)?
Желаемый результат невозможен. Самое последнее время модификации всех не скрытых файлов не обязательно соответствует виртуальному "последнему измененному времени в каталоге, игнорирующему скрытые файлы". Проблема в том, что каталоги изменяются, когда файлы перемещаются и выходят из них, но временные метки файлов не изменяются (файл был перемещен, но не изменен). Итак, ваше предлагаемое решение в лучшем случае эвристическое; вы можете надеяться, что это будет правильно, но нет никакого способа быть уверенным.
В любом случае нет, нет встроенного, который обеспечивает эту эвристику. Концепция скрытых и не скрытых файлов зависит от ОС и файловой системы, а Python не предоставляет встроенного API, который заботится о различии. Если вы хотите создать функцию "last_modified_guess", вам придется написать ее самостоятельно (я рекомендую использовать ее для os.scandir
для повышения эффективности).
Что-то простое:
last_time = max(entry.stat().st_mtime for entry in os.scandir(somedir) if not entry.name.startswith('.'))
вы получите последнее последнее измененное время (в секундах с эпохи) ваших не скрытых записей в каталоге.
Обновление: при дальнейшем glob
модуль glob
включает концепцию .
префикс означает "скрытый", поэтому вы можете использовать glob.glob
/glob.iglob
os.path.join(somedir, '*')
чтобы он отфильтровывал "скрытые" файлы для вас. Тем не менее, вы отказываетесь от некоторых возможных преимуществ os.scandir
(бесплатные или кэшированные stat
, бесплатные проверки типов и т.д.), Поэтому, если вам нужна "скрытая" фильтрация, просто .startswith('.')
проверить не стоит этого.
os.scandir()
scandir
, который предоставляет тот же API под именемscandir.scandir()
, если вы считаете, что оно того стоит. В противном случае, вы застрянете сos.listdir
илиglob.glob
(при поддержкеos.listdir
), что должно быть хорошо, если немного менее дружелюбно, если вы не говорите о каталогах с тысячами файлов или более.