Code: Alles auswählen
sorted(base_path.glob("**/*.csv"))
Code: Alles auswählen
sorted(base_path.glob("**/*.csv"))
rogerb hat geschrieben: ↑Samstag 31. Juli 2021, 08:45 MitBekommst 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.Code: Alles auswählen
sorted(base_path.glob("**/*.csv"))
Code: Alles auswählen
[]
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.@Jghurt: os und glob sind veraltet, statt dessen benutzt man pathlib.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)
Was ist denn die genaue Fehlermeldung?
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)
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
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)
Ich habe jetzt mal nochmal mein genaues Verzeichnis rauskopiert und zensiert:
Code: Alles auswählen
C:\Users\XX\Desktop\XXX\Datenauswertung_CSV\Test_Datenauswertung
Code: Alles auswählen
Data 20.04.2021 10_20_55
Data 12.02.2021 14_23_14
Code: Alles auswählen
2021-4-20_14-5-2 Liste1.csv
2021-4-20_14-5-2 Liste2.csv
Hallo Sirius,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.
Code: Alles auswählen
key=os.path.getmtime
Code: Alles auswählen
next(os.walk(OrdnerPfad)) [2][0]
Danke.DeaD_EyE hat geschrieben: ↑Dienstag 24. August 2021, 14:28dirs sind alle Verzeichnisse innerhalb Sensordaten.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)
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
Code: Alles auswählen
newest_base_path = max(dirs, key=getmtime)
Code: Alles auswählen
next(os.walk(OrdnerPath)) [2][0]
Das würde glaube ich nicht funktionieren, da Liste1 ja nicht immer aktueller als Liste2 ist.
Code: Alles auswählen
da Liste1 ja nicht immer aktueller als Liste2 ist.
Hallo rogerb,rogerb hat geschrieben: ↑Dienstag 24. August 2021, 15:56genau, darum geht man ja auch nicht nach dem Namen sondern den Attributen:Code: Alles auswählen
da Liste1 ja nicht immer aktueller als Liste2 ist.
Zum Beispiel:
st_atime - letzte Zugriffszeit
st_mtime - letzt Änderungszeit
st_ctime - Erstellungszeit
https://docs.python.org/3/library/pathl ... .Path.stat
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()
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]}")
Auf die mtime ist Verlaß, solange die andere Person den Dateiinhalt nicht verändert.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.
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...
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())
[ ] 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...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.
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, ...
Das stimmt, aber dafür hat Python ja so feine Builtins wie all(), any(), filter() und Co...