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

StackOverflow https://stackoverflow.com/questions/168409

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Другие советы

Я делал это в прошлом для сценария 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))

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

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

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

import os 

os.chdir(directory)
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime)

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

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

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

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

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

dataset_path='/mydir/'   
files = glob.glob(dataset_path+"/morepath/*.extension")   
files.sort(key=os.path.getmtime)

В питоне 3.5+

from pathlib import Path
sorted(Path('.').iterdir(), key=lambda f: f.stat().st_mtime)
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.stat(p).st_mtime)

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

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

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

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

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 (), и символическая ссылка будет идти в самом конце списка.

Вот простая пара строк, которая ищет расширение, а также предоставляет опцию сортировки

def get_sorted_files(src_dir, regex_ext='*', sort_reverse=False): 
    files_to_evaluate = [os.path.join(src_dir, f) for f in os.listdir(src_dir) if re.search(r'.*\.({}).format(regex_ext), f)]
    files_to_evaluate.sort(key=os.path.getmtime, reverse=sort_reverse)
    return files_to_evaluate

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top