Как получить список каталогов, отсортированный по дате создания в python?

Как лучше всего получить список всех файлов в каталоге, отсортированный по дате [создан | изменено], используя python, на машине с Windows?

87 голосов | спросил Liza 3 +04002008-10-03T23:10:08+04:00312008bEurope/MoscowFri, 03 Oct 2008 23:10:08 +0400 2008, 23:10:08

11 ответов


0

Вот более подробная версия ответ @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
ответил jfs 12 FebruaryEurope/MoscowbThu, 12 Feb 2009 00:58:21 +0300000000amThu, 12 Feb 2009 00:58:21 +030009 2009, 00:58:21
0

Вот одна строка:

import os
import time
from pprint import pprint

pprint([(x[0], time.ctime(x[1].st_ctime)) for x in sorted([(fn, os.stat(fn)) for fn in os.listdir(".")], key = lambda x: x[1].st_ctime)])

Это вызывает os.listdir (), чтобы получить список имен файлов, затем вызывает os.stat () для каждого, чтобы получить время создания, затем сортирует по времени создания.

Обратите внимание, что этот метод вызывает os.stat () только один раз для каждого файла, что будет более эффективным, чем вызов его для каждого сравнения в сортировке.

ответил Greg Hewgill 3 +04002008-10-03T23:15:23+04:00312008bEurope/MoscowFri, 03 Oct 2008 23:15:23 +0400 2008, 23:15:23
0

Вот моя версия:

def getfiles(dirpath):
    a = [s for s in os.listdir(dirpath)
         if os.path.isfile(os.path.join(dirpath, s))]
    a.sort(key=lambda s: os.path.getmtime(os.path.join(dirpath, s)))
    return a

Сначала мы строим список имен файлов. isfile () используется для пропуска каталогов; это может быть опущено, если каталоги должны быть включены. Затем мы сортируем список на месте, используя дату изменения в качестве ключа.

ответил efotinis 3 +04002008-10-03T23:46:53+04:00312008bEurope/MoscowFri, 03 Oct 2008 23:46:53 +0400 2008, 23:46:53
0

Существует функция os.path.getmtime, которая дает количество секунд с начала эпохи. и должен быть быстрее, чем os.stat.

os.chdir(directory)
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime)
ответил Miguel de Val-Borro 6 FebruaryEurope/MoscowbSun, 06 Feb 2011 19:47:48 +0300000000pmSun, 06 Feb 2011 19:47:48 +030011 2011, 19:47:48
0

Без изменения каталога:

import os    

path = '/path/to/files/'
name_list = os.listdir(path)
full_list = [os.path.join(path,i) for i in name_list]
time_sorted_list = sorted(full_list, key=os.path.getmtime)

print time_sorted_list

# if you want just the filenames sorted, simply remove the dir from each
sorted_filename_list = [ os.path.basename(i) for i in time_sorted_list]
print sorted_filename_list
ответил Nic 21 Maypm15 2015, 21:28:30
0

Вот мой ответ с использованием glob без фильтра, если вы хотите читать файлы с определенным расширением в порядке дат (Python 3).

dataset_path='/mydir/'   
files = glob.glob(dataset_path+"/morepath/*.extension")   
files.sort(key=os.path.getmtime)
ответил dinos66 13 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 13 Sep 2013 13:59:29 +0400 2013, 13:59:29
0
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.stat(p).st_mtime)

Вы можете использовать os.walk('.').next()[-1] вместо фильтрации с помощью os.path.isfile, но в списке остаются неработающие символические ссылки, и os.stat на них не получится.

ответил Alex Coventry 4 +04002008-10-04T00:07:15+04:00312008bEurope/MoscowSat, 04 Oct 2008 00:07:15 +0400 2008, 00:07:15
0

В Python 3.5+

from pathlib import Path
sorted(Path('.').iterdir(), key=lambda f: f.stat().st_mtime)
ответил ignorant 15 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowFri, 15 Sep 2017 07:25:28 +0300 2017, 07:25:28
0

это базовый шаг для изучения:

import os, stat, sys
import time

dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'

listdir = os.listdir(dirpath)

for i in listdir:
    os.chdir(dirpath)
    data_001 = os.path.realpath(i)
    listdir_stat1 = os.stat(data_001)
    listdir_stat2 = ((os.stat(data_001), data_001))
    print time.ctime(listdir_stat1.st_ctime), data_001
ответил cumulus_13 18 +04002011-10-18T06:29:25+04:00312011bEurope/MoscowTue, 18 Oct 2011 06:29:25 +0400 2011, 06:29:25
0

Ответ Алекса Ковентри приведет к исключению, если файл является символической ссылкой на несуществующий файл, этот код исправляет следующий код:

import time
import datetime
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.path.exists(p) and os.stat(p).st_mtime or time.mktime(datetime.now().timetuple())

Если файл не существует, используется now (), и символическая ссылка будет идти в самом конце списка.

ответил Paolo Benvenuto 12 AM000000120000004131 2017, 00:18:41
0

Возможно, вам следует использовать команды оболочки. В Unix /Linux команда find с сортировкой, вероятно, сможет делать то, что вы хотите.

ответил stephanea 3 +04002008-10-03T23:14:18+04:00312008bEurope/MoscowFri, 03 Oct 2008 23:14:18 +0400 2008, 23:14:18

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132