Dateipfad für einen Ordner ausgeben (flexibler Dateipfad zur Auswahl der aktuellsten Datei)

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Mit

Code: Alles auswählen

sorted(base_path.glob("**/*.csv"))
Bekommst du all csv-Dateien in den Unterverzeichnissen von 'base_bath'. Wie gesagt, du must 'base_path' an deine Ordnerstruktur anpassen und vielleicht eine Ebene höher ansetzen.
Jghurt
User
Beiträge: 32
Registriert: Samstag 8. Mai 2021, 15:18

rogerb hat geschrieben: Samstag 31. Juli 2021, 08:45 Mit

Code: Alles auswählen

sorted(base_path.glob("**/*.csv"))
Bekommst du all csv-Dateien in den Unterverzeichnissen von 'base_bath'. Wie gesagt, du must 'base_path' an deine Ordnerstruktur anpassen und vielleicht eine Ebene höher ansetzen.

Also egal was ich probiere, ich kriege als output mit eurem Vorschlag/Skript immer nur
Jghurt
User
Beiträge: 32
Registriert: Samstag 8. Mai 2021, 15:18

Sirius3 hat geschrieben: Freitag 30. Juli 2021, 16:14 @rogerb: ich befürchte ja, dass die xx eigentlich Zahlen sind, und Du daher nach dem falschen Datum die Ordner sortierst, die "Messdaten 31.07.2021" kommen halt lexikalisch vor den "Messdaten 01.08.2021".

Jetzt kann man entweder eine passende Sortierfunktion für die ungünstige Verzeichnisbenennung finden, oder nach der richtigen csv-Dateibenennung sortieren, bzw. da man nur den neusten Eintrag braucht, aus sorted max machen.

Code: Alles auswählen

from pathlib import Path

base_path = Path('D:/xxxxxx/xxxx/Sensordaten')
csv_path = max(base_path.glob("*/Liste_*.csv"), key=lambda p:p.name)
@Jghurt: os und glob sind veraltet, statt dessen benutzt man pathlib.
Was ist denn die genaue Fehlermeldung?

Also bei deinem Code mit meinem Pfad:

Code: Alles auswählen

import os
from pathlib import Path

base_path = Path("C:", "XX", "XX", "Desktop", "XX", "Datenauswertung_CSV", "Test_Datenauswertung")
csv_path = max(base_path.glob("*/Liste_*.csv"), key=lambda p:p.name)
print(csv_path)
Bekomme ich als Output folgenden Fehler:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:/XX/XX/Desktop/Python/py8.py", line 5, in <module>
    csv_path = max(base_path.glob("*/Liste_*.csv"), key=lambda p:p.name)
ValueError: max() arg is an empty sequence
Benutzeravatar
__blackjack__
User
Beiträge: 13066
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Jghurt: Da sind ja laut Deinen Angaben auch keine CSV-Dateien sondern Ordner *in denen* dann die Dateien liegen. Versuchs mal nur mit "Liste_*.csv".

Die Dateizeiten in den Metadaten können übrigens Probleme machen weil die verändert werden können und dann nicht mehr zu dem Datum im Dateinamen passen müssen. Wenn da mal jemand aus versehen oder gar absichtlich eine der Dateien öffnet und wieder speichert, selbst wenn keine Veränderungen vorgenommen wurden, ist die Datei dann plötzlich die ”neueste” was die Zeiten angeht. Oder wenn aus versehen Dateien gelöscht wurden und dann vielleicht von woanders eine Kopie wieder in den Verzeichnisbaum verlegt wird, kann es auch passieren, dass die dann die ”neuesten” sind.

Besser ist es solche Daten im Dateinamen in einem sinnvoll lexikographisch sortierbaren Format zu haben. Was bei den Dateinamen hier wahrscheinlich sogar der Fall ist, aber nicht bei den Verzeichnisnamen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Dann stimmt Deine Verzeichnisstruktur nicht. Wir können ja nur auf dem Aufbauen, was Du uns verraten hast. Das ist dann offensichtlich falsch.
Wie sehen denn Deine Verzeichnise und Dateinamen wirklich aus?
Benutzeravatar
DeaD_EyE
User
Beiträge: 1016
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Code: Alles auswählen

from pathlib import Path
from os.path import getmtime


base_path = Path("D:/xxxxxx/xxxx/Sensordaten")
search = "*.csv"
dirs = (p for p in base_path.iterdir() if p.is_dir())
newest_base_path = max(dirs, key=getmtime)
sorted_csv_files = sorted(newest_base_path.glob(search), key=getmtime)
dirs sind alle Verzeichnisse innerhalb Sensordaten.
newest_base_path ist das neuste Verzeichnis aus Sensordaten.
sorted_csv_files sind alle csv-Dateien aus dem neusten Unterverzeichnis sortiert von alt nach neu
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Jghurt
User
Beiträge: 32
Registriert: Samstag 8. Mai 2021, 15:18

Sirius3 hat geschrieben: Dienstag 24. August 2021, 14:13 Dann stimmt Deine Verzeichnisstruktur nicht. Wir können ja nur auf dem Aufbauen, was Du uns verraten hast. Das ist dann offensichtlich falsch.
Wie sehen denn Deine Verzeichnise und Dateinamen wirklich aus?
Ich habe jetzt mal nochmal mein genaues Verzeichnis rauskopiert und zensiert:

Code: Alles auswählen

C:\Users\XX\Desktop\XXX\Datenauswertung_CSV\Test_Datenauswertung
führt zu mehreren Unterordnern. Als Beispiel:

Code: Alles auswählen

Data 20.04.2021 10_20_55
Data 12.02.2021 14_23_14
Hier möchte ich auf den aktuellsten Ordner zugreifen. Also hier der Pfad C:\Users\XX\Desktop\XXX\Datenauswertung_CSV\Data 20.04.2021 10_20_55

Dort sind dann zwei CSV Dateien. Hier möchte ich auf die oberste Datei zugreifen.

Die zwei Dateien in dem oben genannten Pfad:

Code: Alles auswählen

 2021-4-20_14-5-2 Liste1.csv
 2021-4-20_14-5-2 Liste2.csv
Die CSV Liste auf die ich zugreifen will ist immer oben, da sie den gleichen Dateinamen haben und sich nur an der Nummerierung hinten unterscheiden.

Als output für meinen path möchte ich also in dem hier genannten Beispiel folgendes erhalten:
C:\Users\XX\Desktop\XXX\Datenauswertung_CSV\Data 20.04.2021 10_20_55\2021-4-20_14-5-2 Liste1.csv

Darauf bin ich nur mit den zuvor von mir genannten "veralteten" Methoden gekommen.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei Verzeichnissen ist es ja noch viel interessanten, wenn man sich auf das Änderungsdatum bezieht.
Das handhabt jedes Dateisystem so wie es ihm beliebt. Das ist jedenfalls nichts, worauf ein robuster Algorithmus aufbauen sollte.

@Jghurt: wie wir schon öfter geschrieben haben, ist das Dateinamensformat ungünstig. Wenn man es sich raussuchen darf, schreibt man immer YYYY-MM-DD_hh_mm_ss, also mit führenden Nullen. Bei den Verzeichnissen ist das noch schlimmer, da dort das Jahr hinten steht.
So bleibt Dir nur übrig, den Dateinamen in seine Bestandteile zu zerlegen, und daraus etwas sortierbares zu machen (also ein Tuple).

Es gibt kein "oben" oder "unten" bei Dateinamen. Die haben keine Reihenfolge, Du willst also die Datei mit der kleinsten Zahl nach Liste.

Also erster Schritt wäre "Data 20.04.2021 10_20_55" so in ein Tuple zu konvertieren, dass man es richtig sortieren kann.
Jghurt
User
Beiträge: 32
Registriert: Samstag 8. Mai 2021, 15:18

Sirius3 hat geschrieben: Dienstag 24. August 2021, 14:44 Bei Verzeichnissen ist es ja noch viel interessanten, wenn man sich auf das Änderungsdatum bezieht.
Das handhabt jedes Dateisystem so wie es ihm beliebt. Das ist jedenfalls nichts, worauf ein robuster Algorithmus aufbauen sollte.

@Jghurt: wie wir schon öfter geschrieben haben, ist das Dateinamensformat ungünstig. Wenn man es sich raussuchen darf, schreibt man immer YYYY-MM-DD_hh_mm_ss, also mit führenden Nullen. Bei den Verzeichnissen ist das noch schlimmer, da dort das Jahr hinten steht.
So bleibt Dir nur übrig, den Dateinamen in seine Bestandteile zu zerlegen, und daraus etwas sortierbares zu machen (also ein Tuple).

Es gibt kein "oben" oder "unten" bei Dateinamen. Die haben keine Reihenfolge, Du willst also die Datei mit der kleinsten Zahl nach Liste.

Also erster Schritt wäre "Data 20.04.2021 10_20_55" so in ein Tuple zu konvertieren, dass man es richtig sortieren kann.
Hallo Sirius,

leider kann ich an dem Dateinamensformat nichts ändern, da dies so von meiner Arbeit vorgegeben ist. Vorne steht immer das Datum DD-MM-YYYY. Dahinter steht die Uhrzeit, wann die Datei erstellt wurde STD_MIN_SEK.

Deswegen war hier auch mein damaliger Vorschlag, mit

Code: Alles auswählen

key=os.path.getmtime
den aktuellsten Ordner auszuwählen. Mit

Code: Alles auswählen

next(os.walk(OrdnerPfad)) [2][0]
dann die oberte CSV Datei in diesem Ordner auszugeben.
Dadurch bin ich ja auf ein Ergebnis gekommen. Ich habe dann nur versucht eure Tipps umzusetzen und auf eine bessere Lösung (ohne zB. OS) zu kommen, aber das klappt leider nicht.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Kannst du nicht einfach mit Path.stat() die "jüngste" csv Datei von allen aussuchen. Mit glob() bekommst du ja alle Datein aus allen Unterordnern. Spielen die Ordnernamen überhaupt eine Rolle?
Jghurt
User
Beiträge: 32
Registriert: Samstag 8. Mai 2021, 15:18

DeaD_EyE hat geschrieben: Dienstag 24. August 2021, 14:28

Code: Alles auswählen

from pathlib import Path
from os.path import getmtime


base_path = Path("D:/xxxxxx/xxxx/Sensordaten")
search = "*.csv"
dirs = (p for p in base_path.iterdir() if p.is_dir())
newest_base_path = max(dirs, key=getmtime)
sorted_csv_files = sorted(newest_base_path.glob(search), key=getmtime)
dirs sind alle Verzeichnisse innerhalb Sensordaten.
newest_base_path ist das neuste Verzeichnis aus Sensordaten.
sorted_csv_files sind alle csv-Dateien aus dem neusten Unterverzeichnis sortiert von alt nach neu
Danke.

Code: Alles auswählen

newest_base_path = max(dirs, key=getmtime)

newest_base_path habe ich auch mit getmtime verwendet.
In diesem Ordner sind immer 2 CSV Dateienm die den selben Namen haben (Datum und Erstelldatum) und sich nur an der Nummer hinten unterscheiden: Liste1 & Liste2.
Wie würdest du hier also immer die obere Datei ausgeben lassen (2021-XX-XX_XX-XX-XX_Liste1.csv)

Ich bin mit

Code: Alles auswählen

next(os.walk(OrdnerPath)) [2][0]
darauf gekommen. Dies ist aber anscheinend keine gute Methode.
getmtime kann ich hier nicht anwenden, da die aktuellste Datei nicht immer die Liste1 ist.

Wie würdest du aber dann nur den Dateipfad ausgeben lassen, für Liste1?
Zuletzt geändert von Jghurt am Dienstag 24. August 2021, 15:42, insgesamt 1-mal geändert.
Jghurt
User
Beiträge: 32
Registriert: Samstag 8. Mai 2021, 15:18

rogerb hat geschrieben: Dienstag 24. August 2021, 15:13 Kannst du nicht einfach mit Path.stat() die "jüngste" csv Datei von allen aussuchen. Mit glob() bekommst du ja alle Datein aus allen Unterordnern. Spielen die Ordnernamen überhaupt eine Rolle?
Das würde glaube ich nicht funktionieren, da Liste1 ja nicht immer aktueller als Liste2 ist.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Code: Alles auswählen

da Liste1 ja nicht immer aktueller als Liste2 ist.
genau, darum geht man ja auch nicht nach dem Namen sondern den Attributen:
Zum Beispiel:
st_atime - letzte Zugriffszeit
st_mtime - letzt Änderungszeit
st_ctime - Erstellungszeit

https://docs.python.org/3/library/pathl ... .Path.stat
Jghurt
User
Beiträge: 32
Registriert: Samstag 8. Mai 2021, 15:18

rogerb hat geschrieben: Dienstag 24. August 2021, 15:56

Code: Alles auswählen

da Liste1 ja nicht immer aktueller als Liste2 ist.
genau, darum geht man ja auch nicht nach dem Namen sondern den Attributen:
Zum Beispiel:
st_atime - letzte Zugriffszeit
st_mtime - letzt Änderungszeit
st_ctime - Erstellungszeit

https://docs.python.org/3/library/pathl ... .Path.stat
Hallo rogerb,

Das Problem bei st_mtime ist ja, dass ja beide Listen vom System nacheinander abgespeichert werden. Dadurch kann es je nach Zeitpunkt der Abfrage mit st_mtime passieren, dass mir die Liste 2 ausgegeben werden könnte statt der Liste 1.
Auf st_mtime wäre hier auch kein Verlass, wenn eine andere Person zB. Auf Liste 2 zugreift.
Ich weiß leider auch nicht, ob ich mich immer auf die Erstellungszeit verlassen kann.

Deswegen war ja mein Vorschlag zuvor, mit OS.walk immer die erste der zwei Datei aus diesem Ordner auszuwählen, da die Liste 1 wegen dem Namen immer oben steht.
Deswegen die Frage, ob es nicht vielleicht die Möglichkeit gibt, immer die Datei mit dem Namen auszuwählen, welches Liste1 im Dateinamen ernthält oder ob es eine andere / bessere Methode als OS.walk gibt, um die oberste Datei aus dem Ordner auszuwählen.
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@Jghurt: nochmal, bei Dateien in einem Verzeichnis gibt es kein "oben" und kein "unten". Nochmal, Du brauchst jeweils eine Funktion, die Dir die Verzeichnisnamen und die Dateinamen z.B. in ein Tuple oder datetime parst, nach dem Du sortieren kannst.

Code: Alles auswählen

import re
from pathlib import Path

def parse_dir_date(path):
    # hier path.name in was umwandeln, nach dem man sortieren kann
    return ...

def parse_filename(path):
    # hier path.name in was umwandeln, nach dem man sortieren kann
    # also z.B. die letzte Zahl im Dateinamen
    return int(re.search("\d+$", path.stem).group())

def main():
    basepath = Path.home() / "Desktop" / "XXX" / "Datenauswertung_CSV" / "Test_Datenauswertung"
    newest_datapath = max(basepath.iterdir(), key=parse_dir_date)
    newest_file = min(newest_datapath.iterdir(), key=parse_filename)
    print(newest_file)

if __name__ == "__main__":
    main()
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@Jghurt

Prinzipiell funktioniert es so, du must es aber an deine Namen anpassen, denn ich bin mir nicht mehr sicher wie die Dateien und Ordner jetzt tatsächlich bei dir benannt sind.
Schau dir bitte an wie ich das Datum aus dem Dateinamen parse. Es sollte flexibel genug sein um es an das tatsächliche Format anzupassen.

Im ersten Schritt wird der zuletzt modifizierte Ordner gesucht, dann wird anhand des Dateinamens die aktuelle csv-Datei gesucht.

Code: Alles auswählen

from pathlib import Path
from datetime import datetime

sensor_data = Path("C:/Sensordaten")

# Ordner mit der letzten Modifikationszeit finden
first_sub_dir = next(
    element 
    for element
    in sorted(sensor_data.iterdir(), key=lambda p: p.stat().st_mtime, reverse=True) # sortieren nach Modifikationszeit
    if element.is_dir() # nur ordner sollen gefunden werden
)


# Namen der CSV-Dateien in sortierbares Datum umwandeln und als Tupel anlegen und danach sortieren
ordered_files = sorted((
    (datetime.strptime(measurement_data_path.stem.split("_")[1], "%Y-%d-%m"), measurement_data_path) # Datum, path Tuple erstellen
    for measurement_data_path 
    in first_sub_dir.iterdir()), key = lambda sortkey: sortkey[0], reverse=True # und nach Datum sortieren
)

print(f"Zuletzt geänderter Ordner: {first_sub_dir}")
print(f"Letzte Datei: {ordered_files[0][1]}")
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

Jghurt hat geschrieben: Mittwoch 25. August 2021, 06:04 Das Problem bei st_mtime ist ja, dass ja beide Listen vom System nacheinander abgespeichert werden. Dadurch kann es je nach Zeitpunkt der Abfrage mit st_mtime passieren, dass mir die Liste 2 ausgegeben werden könnte statt der Liste 1.
Auf st_mtime wäre hier auch kein Verlass, wenn eine andere Person zB. Auf Liste 2 zugreift.
Auf die mtime ist Verlaß, solange die andere Person den Dateiinhalt nicht verändert.
Jghurt hat geschrieben: Mittwoch 25. August 2021, 06:04 Ich weiß leider auch nicht, ob ich mich immer auf die Erstellungszeit verlassen kann.
Ansonsten ist das ganze Speicherkonzept, mit Verlaub, für einen Körperteil, der sich bei den meisten Menschen zwischen Lendenwirbelsäule und Oberschenkel befindet. Das muß mal jemand aufräumen! Dringend! Und zum Beispiel dafür sorgen, daß niemand mehr Zugriff auf diese Daten hat mit Ausnahme eines Skripts, das sie nach der Ankunft sofort in eine Datenbank pumpt und dann entweder löscht oder an einem Ort archiviert, auf den nicht jeder Hansel zugreifen kann...

Aber, gut, genug gerantet -- ich habe mir einstweilen den Spaß erlaubt, eine kleine rekursive Lösung mit os.walk() zu schreiben, die allerdings auch noch die os.path.getmtime()-Funktion benutzt, und darum nur die Datei zurückgibt, deren Inhalt (siehe oben) zuletzt geändert worden ist.

Wenn Du magst, kannst Du das natürlich abändern, so daß das Datum der Datei geparst und als Value im Dictionary "self.files" verwendet wird. Aber Achtung: anstatt dort Reguläre Ausdrücke zu verwenden, empfehle ich eine dazu passende Bibliotheksfunktion wie dateutil.parser.parse, da aber bitte die Parameter "dayfirst" und "yearfirst" beachten! Eine Vorlage für eine solche Funktion findest Du oben auskommentiert im folgenden Code, wenn Du die vom Betriebssystem geführten Zeitstempel ("mtime") nicht benutzen möchtest.

Code: Alles auswählen

#!/usr/bin/env python
import os
from pathlib import Path
from operator import itemgetter
from argparse import ArgumentParser

'''
from dateutil.parser import parse as dateparse

def filename_date(filename):
    _, rest = filename.split('_', maxsplit=1)
    datestr, _ = rest.split('.')
    dateobj = dateparse(datestr, dayfirst=False)
    return dateobj
'''


class Walker:
    def __init__(self, top):
        self.files = {}
        self.dirs = [top]

    def adder(self, dirpath, dirnames, filenames):
        self.dirs += dirnames
        for filename in filenames:
            fullname = Path(os.path.join(dirpath, filename))
            self.files[fullname] = os.path.getmtime(fullname)
        
    def runner(self):
        directory = self.dirs.pop(0)
        for dirpath, dirnames, filenames in os.walk(directory):
            self.adder(dirpath, dirnames, filenames)

    def get_newest(self):
        return sorted(self.files.items(), key=itemgetter(1), reverse=True)[0][0]


if __name__ == '__main__':
    parser = ArgumentParser(description='demo for file search')
    parser.add_argument('basepath', nargs='*', default='__base__', help='the base path to search')
    args = parser.parse_args()

    walker = Walker(args.basepath)
    walker.runner()
    print(walker.get_newest())
HTH und HF! ;-)

PS: Anstelle von "__base__" in Zeile 4 solltest Du natürlich Dein korrektes Verzeichnis eintragen. HF! ;-)
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@LukeNukem: Du importierst pathlib, nutzst das aber gar nicht wirklich, sondern os.path!?
Methoden werden nach Tätigkeiten benannt, also add_files statt adder und run statt runner.
self.dirs enthält maximal einen Eintrag, da braucht man keine Liste. Das dirs in adder sollte anders benannt werden, das sind ja zwei verschiedene Dinge. Du hast keine Rekursion.
Nur um das größte Element zu suchen, benutzt man nicht sorted sondern max.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@LukeNukem,

das Problem ist ja dass man sich eben nicht nach den Metadaten mit mstat richten kann, da sie laut Jghurt in der falschen zeitlichen Reihenfolge gespeichert werden könnten. Daher ist einzig der Datumstempel im Dateinamen aussagekräftig um die aktuelle Datei zu erhalten.
Es soll im zeitlich letzten Ordner eine von zwei Dateien mit dem letzten Datumstempel im Namen gefunden werden.
Deine Walker-Klasse findet auch lose Dateien die irgendwo in den Unterverzeichnissen liegen und gibt fälschlicherweise diese aus.
LukeNukem
User
Beiträge: 232
Registriert: Mittwoch 19. Mai 2021, 03:40

rogerb hat geschrieben: Donnerstag 26. August 2021, 08:08 das Problem ist ja dass man sich eben nicht nach den Metadaten mit mstat richten kann, da sie laut Jghurt in der falschen zeitlichen Reihenfolge gespeichert werden könnten. Daher ist einzig der Datumstempel im Dateinamen aussagekräftig um die aktuelle Datei zu erhalten.
[ ] Ja, [ ] Nein, [ ] Vielleicht... pick any two. Im Ernst: ich habe in diesem Thread mittlerweile so viel Irres, Wirres, Verwirrendes und Widersprüchliches von unserem hochverehrten und bemitleidenswerten TO gelesen, daß ich mir bei genau gar nichts mehr sicher bin. Erst wird die Datei nur alle paar Wochen angelegt, dann aber dieselbe Datei mehrmals täglich, in verschiedenen, mitunter falschen Verzeichnissen, und als wäre das nicht schon verrückt genug, scheinen wohl auch noch Kollegen irgendwie manuell in, an, oder darumherum an den Dateien herumzuhantieren...

Insofern, kurz gesagt: ich weiß wenig bis nichts über die tatsächlichen Gegebenheiten, und in solchen Fällen kenne ich nur eine sinnvolle Strategie: erstmal alle Informationen einsammeln, derer ich habhaft werden kann, und am Ende filtere ich mir aus dieser Sammlung heraus, was ich wirklich brauche. Das ist der Grund, warum ich die Rekursion mit os.walk() nutze, dabei die Verzeichnisinformationen in Walker::dirs behalte -- wobei: das hätte ich, sehe ich gerade, anders machen sollen oder mir gleich sparen können -- und warum ich die gesammelten Daten erst ganz am Ende auseinanderklamüsere. Auf diese Weise habe ich nämlich viele schicke Optionen in meiner Walker.get_newest(), zum Beispiel, mir alle Dateien mit demselben Zeitstempel herauszusuchen und daraus die laut Neueste (laut mtime), Größte, Kleinste, abhängig vom Verzeichnisnamen zu benutzen, oder... you get the idea. Die values() meines Dictionary Walker.files dienen ja nur für eine erste Sortierung... wie wo was ich danach sortiere, kann ich mir dann ja immer noch aussuchen.
rogerb hat geschrieben: Donnerstag 26. August 2021, 08:08 Es soll im zeitlich letzten Ordner eine von zwei Dateien mit dem letzten Datumstempel im Namen gefunden werden.
Bist Du sicher? Ich nicht, und ich habe die verschiedenen Ausführungen des TO mehrmals gelesen. Angeblich können Dateien mit demselben Zeitstempel ja auch in verschiedenen Ordnern auftauchen. Und überhaupt, der Zeitstempel: mal ist es nur ein Datum, dann wieder ein Zeitstempel mit Datum und Uhrzeit, ...
rogerb hat geschrieben: Donnerstag 26. August 2021, 08:08 Deine Walker-Klasse findet auch lose Dateien die irgendwo in den Unterverzeichnissen liegen und gibt fälschlicherweise diese aus.
Das stimmt, aber dafür hat Python ja so feine Builtins wie all(), any(), filter() und Co... ;-)

Das Einfachste wäre vermutlich, wenn unser hochverehrter Herr TO ein bewährtes Werkzeug wie tree(1) benutzen, seinen Verzeichnisbaum damit rekursiv ausgeben und uns einfach mal zeigen könnte, idealerweise auch mit Zeitstempeln (Optionen -D (mtime) und -c (ctime)). Ja, ich weiß, der Arme hat leider ein Windows, aber unter aktuellen Windows-Systemen soll es doch dieses kongeniale WSL2 (Windows Subsystem for Linux) geben, mit dem man auch Ubuntu-Pakete wie "tree" installieren und benutzen kann... auf diese Weise würden wir vielleicht wirklich mal sehen, was er da hat, anstatt uns auf schwurbelige, widersprüchliche, immer wieder neue und andere Erläuterungen einlassen zu müssen. Und diese Heimlichtuerei mit der Maskierung von Pfaden... das hilft halt auch keinem. :roll:

Am Ende, wie schon gesagt: solche Daten gehören inhärent in eine Art zentralisiertes Datenspeichersystem, zum Beispiel eine Datenbank wie PostgreSQL oder MongoDB, in einen indizierten Columnar Store wie Elasticsearch (das hätte zudem den Vorteil, daß dabei mit Kibana ein sehr leistungsfähiges Webfrontend für die Datenanalyse, -aggregation und Visualisierung aus der Tüte fällt) oder meinetwegen auch in einen Redis-Cluster. Dieses, insbesondere auch manuelle, Herumgehampel auf CSV-Dateien ist ein Alptraum für jeden, der damit arbeiten muß, für jede Automatisierung, und hinter jeder Ecke lauert ein Heer von sehr, sehr bösen Fehlern.
Antworten