Automatisches verschieben mehrere Daten

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.
Antworten
thierry
User
Beiträge: 2
Registriert: Mittwoch 14. April 2021, 22:24

Hallo Zusammen

Ich habe folgendes Problem / Denkblockade. Ich möchte aus dem Ordner "Ende", in den alle 6 Stunden ein neues CSV File hinein gespeichert, zwei Files drin lassen und das älteste in den Ordner "Ende" verschieben sobald ein neues kommt. Das Problem ist ich möchte das mit "Anlage_0001, Anlage_0003, Anlage_0009 und Anlage_0010" machen das pro Anlage immer nur zwei Fils im Ordner "Ende" sind

Hat jemand eine Idee, wie ich das umsetzten kann?

https://kronos.datatresor.ch/index.php/ ... 6mkKWeFa4X
Bild

Ich danke schon im voraus für die Antworten. :D
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du denn schon versucht? Wie sieht Dein Programm jetzt aus?

Erster Schritt wäre mit pathlib.Path.iterdir sich alle Dateinamen geben lassen, diese anhand der Anlagennummer gruppieren lassen, dann nach dem Datum innerhalb jeder Liste sortieren und dann die entsprechenden Dateien verschieben.

Was gut an den Dateinamen ist, ist dass die Anlagennummer vorne mit 4 Ziffern steht, so dass Du einfach mit sorted und groupby arbeiten kannst; was schlecht an den Dateinamen ist, ist dass das Datumsformat falsch ist, weil das Jahr nicht ganz vorne steht (YYYY-MM-DD) sondern (DD.MM.YYYY), so dass das sortieren nach Datum komplizierter ist (datetime.datetime.strptime).
thierry
User
Beiträge: 2
Registriert: Mittwoch 14. April 2021, 22:24

Den Ordner auslesen ist nicht, dass Problem, das geht ziemlich gut. Ich verschiebe die Daten auch in verschiedene Listen, aber wie ich dort das älteste in einen anderen Ordner verschiebe, bekomme ich nicht hin. Vielleicht ist auch mein Ansatz falsch.
Das ist das was ich jetzt habe.

Code: Alles auswählen

import shutil
import os
import csv
import time

source = r"C:\Users\TY\Nextcloud\Test\Ende"
destination = r'C:\Users\TY\Nextcloud\Test\Ziel'

dirPath = source
result = [f for f in os.listdir(dirPath) if os.path.isfile(os.path.join(dirPath, f))]

liste01 = []
liste03 = []
liste09 = []
liste10 = []


for liste in result:
    time.gmtime(os.path.getmtime(source +'\Anlage' + liste[6:]))

    kürzel = liste[7:-21]
    print(kürzel)

    if kürzel == '0001':
        liste01.append(kürzel)

    elif kürzel == '0003':
        liste03.append(kürzel)

    elif kürzel == '0009':
        liste09.append(kürzel)

    elif kürzel == '0010':
        liste10.append(kürzel)

print(liste01)
print(liste03)
print(liste09)
print(liste10)
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie schon geschrieben, benutze pathlib.Path und nicht os.path und vor allem stückelt man keine Pfade per + zusammen.
Statt mehrerer Listen ist ein Wörterbuch die richtige Struktur.

Auch hier, wie bei allen Programmierproblemen, mußt Du das Problem in mehrere Teilprobleme aufteilen.
Zum einen das Parsen eines Dateinamens nach den relevanten Informationen und zum anderen das Filtern aller Dateinamen nach diesen Informationen:

Code: Alles auswählen

import re
import datetime
from pathlib import Path
from collections import namedtuple

BASEPATH = Path("C:/Users/TY/Nextcloud/Test")
SOURCE = BASEPATH / "Ende"
DESTINATION = BASEPATH / "ZIEL"

ParsedFilename = namedtuple("ParsedFilename", "anlage,date,filename")

def parse_filename(filename):
    """ returns Anlage and Datetime """
    match = re.match(r'Anlage_(\d+)_(\d+\.\d+.\d+.\d+.\d+)', filename.stem)
    if not match:
        raise ValueError("Wrong filename format")
    anlage = int(match.group(1))
    date = datetime.datetime.strptime(match.group(2), '%d.%m.%Y.%H.%M')
    return ParsedFilename(anlage, date, filename)

def main():
    filenames = sorted(map(parse_filename, SOURCE.glob('Anlage*')))
    for _, anlage_filenames in groupby(filenames, key=lambda f:f.anlage):
        print(list(anlage_filenames))

if __name__ == "__main__":
    main()
Antworten