Как игнорировать скрытые файлы при использовании os.stat () в Python?

1

Я пытаюсь получить время последней модификации (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-2.7
python-os

1 ответ

3
Лучший ответ

Желаемый результат невозможен. Самое последнее время модификации всех не скрытых файлов не обязательно соответствует виртуальному "последнему измененному времени в каталоге, игнорирующему скрытые файлы". Проблема в том, что каталоги изменяются, когда файлы перемещаются и выходят из них, но временные метки файлов не изменяются (файл был перемещен, но не изменен). Итак, ваше предлагаемое решение в лучшем случае эвристическое; вы можете надеяться, что это будет правильно, но нет никакого способа быть уверенным.

В любом случае нет, нет встроенного, который обеспечивает эту эвристику. Концепция скрытых и не скрытых файлов зависит от ОС и файловой системы, а 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('.') проверить не стоит этого.

  • 0
    Прекрасно работает для Python3, но забыл упомянуть, что я использую Python2.7, который не имеет os.scandir()
  • 1
    @wcarhart: существует сторонний пакет PyPI, scandir , который предоставляет тот же API под именем scandir.scandir() , если вы считаете, что оно того стоит. В противном случае, вы застрянете с os.listdir или glob.glob (при поддержке os.listdir ), что должно быть хорошо, если немного менее дружелюбно, если вы не говорите о каталогах с тысячами файлов или более.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню