Как получить список каталогов, отсортированный по дате создания в python? - PullRequest
96 голосов
/ 03 октября 2008

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

Ответы [ 13 ]

113 голосов
/ 03 октября 2008

В прошлом я делал это для скрипта Python, чтобы определить последние обновленные файлы в каталоге:

import glob
import os

search_dir = "/mydir/"
# remove anything from the list that is not a file (directories, symlinks)
# thanks to J.F. Sebastion for pointing out that the requirement was a list 
# of files (presumably not including directories)  
files = filter(os.path.isfile, glob.glob(search_dir + "*"))
files.sort(key=lambda x: os.path.getmtime(x))

Это должно сделать то, что вы ищете на основе файла mtime.

РЕДАКТИРОВАТЬ : Обратите внимание, что вы также можете использовать os.listdir () вместо glob.glob (), если хотите - причина, по которой я использовал glob в моем исходном коде, заключалась в том, что я хотел использовать glob искать только файлы с определенным набором расширений файлов, для которых glob () больше подходит. Чтобы использовать listdir, вот как это будет выглядеть:

import os

search_dir = "/mydir/"
os.chdir(search_dir)
files = filter(os.path.isfile, os.listdir(search_dir))
files = [os.path.join(search_dir, f) for f in files] # add path to each file
files.sort(key=lambda x: os.path.getmtime(x))
52 голосов
/ 12 февраля 2009

Вот более подробная версия ответа @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
21 голосов
/ 06 февраля 2011

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

import os 

os.chdir(directory)
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime)
21 голосов
/ 03 октября 2008

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

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 () используется для пропуска каталогов; это может быть опущено, если каталоги должны быть включены. Затем мы сортируем список на месте, используя дату изменения в качестве ключа.

20 голосов
/ 03 октября 2008

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

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 () только один раз для каждого файла, что будет более эффективным, чем вызов его для каждого сравнения в сортировке.

15 голосов
/ 21 мая 2015

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

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
10 голосов
/ 13 сентября 2013

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

dataset_path='/mydir/'   
files = glob.glob(dataset_path+"/morepath/*.extension")   
files.sort(key=os.path.getmtime)
5 голосов
/ 15 сентября 2017

В питоне 3,5 +

from pathlib import Path
sorted(Path('.').iterdir(), key=lambda f: f.stat().st_mtime)
4 голосов
/ 04 октября 2008
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.stat(p).st_mtime)

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

1 голос
/ 12 августа 2017

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

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())

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...