Как лучше всего получить список всех файлов в каталоге, отсортированный по дате [создано | изменено] с использованием Python на машине Windows?
129
Обновление : для сортировки dirpath
записей по дате модификации в Python 3:
import os
from pathlib import Path
paths = sorted(Path(dirpath).iterdir(), key=os.path.getmtime)
(поместите здесь ответ @ Pygirl для большей наглядности)
Если у вас уже есть список имен файлов files
, чтобы отсортировать его по времени создания в Windows:
files.sort(key=os.path.getctime)
Список файлов, которые вы можете получить, например, используя, glob
как показано в ответе @Jay .
старый ответ
Вот более подробная версия @Greg Hewgill
ответа . Он наиболее соответствует требованиям вопроса. Он делает различие между датами создания и изменения (по крайней мере, в Windows).
#!/usr/bin/env python
from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time
# path to the directory (relative or absolute)
dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'
# get all entries in the directory w/ stats
entries = (os.path.join(dirpath, fn) for fn in os.listdir(dirpath))
entries = ((os.stat(path), path) for path in entries)
# leave only regular files, insert creation date
entries = ((stat[ST_CTIME], path)
for stat, path in entries if S_ISREG(stat[ST_MODE]))
#NOTE: on Windows `ST_CTIME` is a creation date
# but on Unix it could be something else
#NOTE: use `ST_MTIME` to sort by a modification date
for cdate, path in sorted(entries):
print time.ctime(cdate), os.path.basename(path)
Пример:
$ python stat_creation_date.py
Thu Feb 11 13:31:07 2009 stat_creation_date.py
cdate
число секунд с плавающей точкой с начала эпохи.stat
один раз для каждого dir.entry.Я делал это в прошлом для сценария Python, чтобы определить последние обновленные файлы в каталоге:
Это должно делать то, что вы ищете, на основе файла mtime.
РЕДАКТИРОВАТЬ : обратите внимание, что вы также можете использовать os.listdir () вместо glob.glob (), если хотите - причина, по которой я использовал glob в моем исходном коде, заключалась в том, что я хотел использовать glob только для поиска файлов с определенным набором расширений файлов, для которых больше подходит glob (). Вот как это будет выглядеть для использования listdir:
источник
files.sort(key=lambda fn: os.path.getmtime(os.path.join(search_dir, fn)))
files.sort(key=os.path.getmtime)
должно работать (безlambda
).Есть
os.path.getmtime
функция, которая показывает количество секунд с начала эпохи и должна быть быстрее, чемos.stat
.источник
Вот моя версия:
Сначала мы создаем список имен файлов. isfile () используется для пропуска каталогов; его можно не указывать, если необходимо включить каталоги. Затем мы сортируем список на месте, используя дату изменения в качестве ключа.
источник
a[-5:]
Вот однострочник:
Это вызывает os.listdir () для получения списка имен файлов, затем вызывает os.stat () для каждого из них, чтобы получить время создания, а затем выполняет сортировку по времени создания.
Обратите внимание, что этот метод вызывает os.stat () только один раз для каждого файла, что будет более эффективно, чем вызов его для каждого сравнения в сортировке.
источник
Без смены каталога:
источник
В Python 3.5+
источник
f.stat().st_ctime
вместо даты создания используйте .Вот мой ответ с использованием glob без фильтра, если вы хотите читать файлы с определенным расширением в порядке даты (Python 3).
источник
источник
Вы можете использовать
os.walk('.').next()[-1]
вместо фильтрации сos.path.isfile
, но это оставляет мертвые символические ссылки в списке иos.stat
не работает с ними.источник
или
или
где m время - модифицированное время.
источник
это основной шаг для обучения:
источник
Ответ Алекса Ковентри вызовет исключение, если файл является символической ссылкой на несуществующий файл, следующий код исправляет этот ответ:
Когда файл не существует, используется now (), и символическая ссылка будет находиться в самом конце списка.
источник
Вот пара простых строк, которые ищут расширение, а также предоставляют возможность сортировки
источник
Для полноты
os.scandir
(в 2 раза быстрееpathlib
):источник
Это была моя версия:
источник
Возможно, вам стоит использовать команды оболочки. В Unix / Linux команда find piped with sort, вероятно, сможет делать то, что вы хотите.
источник