Frage

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

War es hilfreich?

Lösung

Hier ist eine ausführlichere Version von @Greg Hewgill Antwort . Es ist das Conforming auf die Frage Anforderungen. Es macht einen Unterschied zwischen Erstellungs- und Änderungsdatum (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

Andere Tipps

Ich habe einen Python-Skript dies in der Vergangenheit getan, um die letzten aktualisierten Dateien in einem Verzeichnis zu bestimmen:

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 das tun, was Sie suchen, basierend auf Datei mtime.

Bearbeiten : Beachten Sie, dass Sie auch os.listdir () anstelle von glob.glob (), falls gewünscht können - der Grund, warum ich glob in meinem ursprünglichen Code verwendet wurde, dass ich will verwenden glob nur mit einem bestimmten Satz von Dateierweiterungen für Dateien zu suchen, die glob () war besser geeignet. So verwenden listdir hier, was es würde so aussehen:

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

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

Erstens haben wir eine Liste der Dateinamen aufzubauen. isfile () wird verwendet Verzeichnisse überspringen; es kann entfallen, wenn Verzeichnisse aufgenommen werden sollten. Dann wir die Liste an Ort und Stelle sortieren, das Änderungsdatum als Schlüssel verwendet wird.

Es gibt eine os.path.getmtime Funktion, die die Anzahl der Sekunden seit der Epoche gibt und sollte schneller als os.stat sein.

import os 

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

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

Das nennt os.listdir (), um eine Liste der Dateinamen zu bekommen, dann ruft os.stat () für jeden die Erstellungszeit zu bekommen, dann Sorten gegen die Erstellungszeit.

Beachten Sie, dass diese Methode nur Anrufe os.stat () einmal für jede Datei, die effizienter sein wird als es für jeden Vergleich in einer Art aufgerufen wird.

Ohne Änderung Verzeichnis:

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

Hier ist meine Antwort glob ohne Filter verwenden, wenn Sie Dateien mit einer bestimmten Endung in chronologischer Reihenfolge (Python 3) lesen mögen.

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

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

Sie könnten os.walk('.').next()[-1] verwenden, anstatt mit os.path.isfile von Filtern, aber das läßt totes Symlinks in der Liste, und os.stat wird auf sich versagen.

Dies ist ein grundlegender Schritt für lernen:

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

Alex Coventry Antwort wird eine Ausnahme erzeugen, wenn die Datei ein symbolischer Link auf eine unexistent Datei ist 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, jetzt () verwendet wird, und die Symlink wird ganz am Ende der Liste gehen.

Hier ist ein einfaches Paar Linien, die eine Sortieroption auf und bietet für die Erweiterung sieht

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

Vielleicht sollten Sie Shell-Befehle verwenden. In Unix / Linux, finden verrohrt mit Art in der Lage, wahrscheinlich zu tun, was Sie wollen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top