it-swarm.com.de

Wie erhält man eine Verzeichnisliste sortiert nach Erstellungsdatum in Python?

Was ist der beste Weg, um eine Liste aller Dateien in einem Verzeichnis, sortiert nach Erstellungsdatum, zu erhalten? geändert], mit Python, auf einem Windows-Computer?

102
Liza

Hier ist eine ausführlichere Version von @Greg Hewgill 's Antwort . Es entspricht am ehesten den Fragenanforderungen. Es wird zwischen Erstellungs- und Änderungsdatum unterschieden (zumindest unter 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)

Beispiel:

$ python stat_creation_date.py
Thu Feb 11 13:31:07 2009 stat_creation_date.py
53
jfs

Ich habe dies in der Vergangenheit für ein Python Skript gemacht, um die zuletzt aktualisierten Dateien in einem Verzeichnis zu ermitteln:

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

Das sollte tun, wonach Sie suchen, basierend auf der Datei mtime.

EDIT : Beachten Sie, dass Sie bei Bedarf auch os.listdir () anstelle von glob.glob () verwenden können - der Grund, warum ich glob in meinem ursprünglichen Code verwendet habe war, dass ich glob verwenden wollte, um nur nach Dateien mit bestimmten Dateierweiterungen zu suchen, für die glob () besser geeignet war. So verwenden Sie 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))
121
Jay

Da ist ein os.path.getmtime Funktion, die die Anzahl der Sekunden seit der Epoche angibt und schneller sein sollte als os.stat.

import os 

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

Hier ist meine Version:

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

Zunächst erstellen wir eine Liste der Dateinamen. Mit isfile () werden Verzeichnisse übersprungen. es kann weggelassen werden, wenn Verzeichnisse enthalten sein sollen. Anschließend sortieren wir die Liste direkt mit dem Änderungsdatum als Schlüssel.

22
efotinis

Hier ist ein Einzeiler:

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

Dies ruft os.listdir () auf, um eine Liste der Dateinamen zu erhalten, ruft dann os.stat () für jede auf, um die Erstellungszeit zu erhalten, und sortiert dann gegen die Erstellungszeit.

Beachten Sie, dass diese Methode os.stat () nur einmal für jede Datei aufruft. Dies ist effizienter, als es für jeden Vergleich in einer Sortierung aufzurufen.

20
Greg Hewgill

Ohne das Verzeichnis zu wechseln:

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
15
Nic

Hier ist meine Antwort mit Glob ohne Filter, wenn Sie Dateien mit einer bestimmten Erweiterung in der Reihenfolge des Datums lesen möchten (Python 3).

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

In python 3.5+

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

Sie könnten os.walk('.').next()[-1] verwenden, anstatt mit os.path.isfile Zu filtern, aber das lässt tote Symlinks in der Liste und os.stat Schlägt bei ihnen fehl.

4
Alex Coventry

Die Antwort von Alex Coventry führt zu einer Ausnahme, wenn es sich bei der Datei um einen Symlink zu einer nicht vorhandenen Datei handelt. Der folgende Code korrigiert diese Antwort:

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

Wenn die Datei nicht existiert, wird now () verwendet und der Symlink steht ganz am Ende der Liste.

1
Paolo Benvenuto

dies ist ein grundlegender Lernschritt:

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
1
cumulus_13

Hier sind ein paar einfache Zeilen, die nach einer Erweiterung suchen und eine Sortieroption bieten

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
0
TXN_747