it-swarm.com.de

Glob-Suchdateien in Datumsreihenfolge?

Ich habe diese Codezeile in meinem Python-Skript. Es durchsucht alle Dateien in einem bestimmten Verzeichnis nach * cycle * .log.

for searchedfile in glob.glob("*cycle*.log"):

Dies funktioniert einwandfrei, aber wenn ich mein Skript an einem Netzwerkspeicherort ausführe, durchsucht es sie nicht in der angegebenen Reihenfolge, sondern nach dem Zufallsprinzip.

Gibt es eine Möglichkeit, den Code zu zwingen, nach Datumsreihenfolge zu suchen?

Diese Frage wurde für PHP gestellt, aber ich bin mir der Unterschiede nicht sicher.

Vielen Dank

15
Jason Rogers

Dateien nach Datum sortieren:

import glob
import os

files = glob.glob("*cycle*.log")
files.sort(key=os.path.getmtime)
print("\n".join(files))

Siehe auch Sortierung WIE ZU .

43
jfs

Gut. Die Antwort ist nein. glob verwendet os.listdir das beschrieben wird durch:

" Gibt eine Liste zurück, die die Namen der Einträge in dem durch path angegebenen Verzeichnis enthält. Die Liste ist in beliebiger Reihenfolge. Die speziellen Einträge '.' und '..', auch wenn sie im Verzeichnis vorhanden sind. "

Sie haben also wirklich Glück, dass Sie es sortiert haben. Sie müssen es selbst sortieren.

Das funktioniert für mich:

import glob
import os
import time

searchedfile = glob.glob("*.cpp")
files = sorted( searchedfile, key = lambda file: os.path.getctime(file))

for file in files:
 print("{} - {}".format(file, time.ctime(os.path.getctime(file))) )

Beachten Sie auch, dass hierbei die Erstellungszeit verwendet wird. Wenn Sie die Änderungszeit verwenden möchten, muss die verwendete Funktion getmtime sein.

4
luk32

Wenn Ihre Pfade in sortierbarer Reihenfolge sind, können Sie sie immer als Zeichenfolgen sortieren (wie andere bereits in ihren Antworten erwähnt haben). 

Wenn Ihre Pfade jedoch ein Datum/Uhrzeit-Format wie %d.%m.%Y verwenden, ist dies etwas anfälliger. Da strptime keine Platzhalterzeichen unterstützt, haben wir ein Modul datetime-glob entwickelt, um Datum und Uhrzeit von Pfaden einschließlich Platzhaltern zu analysieren. 

Mit datetime-glob können Sie durch den Baum gehen, ein Verzeichnis auflisten, Datum/Uhrzeit analysieren und sie als Tupel (date/time, path) sortieren.

Aus den Testfällen des Moduls:

import pathlib
import tempfile

import datetime_glob

def test_sort_listdir(self):
    with tempfile.TemporaryDirectory() as tempdir:
        pth = pathlib.Path(tempdir)
        (pth / 'some-description-20.3.2016.txt').write_text('tested')
        (pth / 'other-description-7.4.2016.txt').write_text('tested')
        (pth / 'yet-another-description-1.1.2016.txt').write_text('tested')

        matcher = datetime_glob.Matcher(pattern='*%-d.%-m.%Y.txt')
        subpths_matches = [(subpth, matcher.match(subpth.name)) for subpth in pth.iterdir()]
        dtimes_subpths = [(mtch.as_datetime(), subpth) for subpth, mtch in subpths_matches]

        subpths = [subpth for _, subpth in sorted(dtimes_subpths)]

        # yapf: disable
        expected = [
            pth / 'yet-another-description-1.1.2016.txt',
            pth / 'some-description-20.3.2016.txt',
            pth / 'other-description-7.4.2016.txt'
        ]
        # yapf: enable

        self.assertListEqual(subpths, expected)
0
marko.ristin

Sie können die Liste der zurückkommenden Dateien mit os.path.getmtime oder os.path.getctime sortieren. Sehen Sie sich diese andere SO answer an und beachten Sie auch die Kommentare.

0
Tom

Im Wesentlichen dasselbe wie @jfs, jedoch in einer Zeile mit sorted

import os,glob
searchedfiles = sorted(glob.glob("*cycle*.log"), key=os.path.getmtime)
0
Pablo Reyes

Verwendung von Glob-Nr. Bei der Verwendung von glob speichert Glob derzeit alle Dateien gleichzeitig im Code und verfügt über keine Methoden zum Organisieren dieser Dateien. Wenn nur das Endergebnis wichtig ist, können Sie eine zweite Schleife verwenden, die das Datum der Datei überprüft und darauf basierend die Daten neu erstellt. Wenn die Parser-Reihenfolge wichtig ist, ist glob wahrscheinlich nicht der beste Weg, dies zu tun.

0
Dylan Lawrence