Dateien sortieren



  • @SeppJ sagte in Dateien sortieren:

    @Swordfish : Beim Blick auf die Kommentare fällt mir auf: In der Pythonversion wird gar nicht geprüft ob man eine Datei oder ein Verzeichnis vorliegen hat. Wenn ich mich recht erinnere, enthält os.listdir auch Verzeichnisse, und es ist unspezifiziert, ob neue Einträge darin auftauchen, die entstanden sind nach Iterationsstart.

    Das ist also

    1. nicht das gewünschte Verhalten
    2. ein Rezept für eine Endlosrekursion

    Ich brauchte dann 3 leitende Nachfragen, bis die KI eine vollständige, korrekte Version produzieren konnte. Da sieht man den Grund, warum ich nicht besorgt bin um meinen Arbeitsplatz. Und es wäre dann doch schneller gegangen, es einfach selber runterzutippen, als diesen Fehler zu sehen und zu beheben, obwohl die Aufgabe sehr simpel ist. Schwach.

    Meine KI Variante mit pathlib hatte direkt auch einen Check für die Verzeichnisse 😃 Aber ja die Erfahrung mache ich mit ChatGPT auch immer. Man muss eig. schon genau wissen, was man will, damit die KI mit hoher Wahrscheinlichkeit was (komplett) richtiges produziert und dann kann man es auch schon fast selber machen



  • Hier der Java-Flavour.

    F: Schreibe ein Programm in Java, dass alle Dateien in einem Ordner in Unterordner verschiebt, die mit dem ersten Buchstaben des Dateinamen anfangen.

    import java.io.File;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    
    public class FileSorter {
        public static void main(String[] args) {
            String directoryPath = "path/to/directory";
            File directory = new File(directoryPath);
            File[] files = directory.listFiles();
    
            if (files == null) {
                System.out.println("Directory does not exist or is not a directory.");
                return;
            }
    
            for (File file : files) {
                if (file.isFile()) {
                    char firstLetter = file.getName().charAt(0);
                    String subdirectoryPath = directoryPath + "/" + firstLetter;
                    File subdirectory = new File(subdirectoryPath);
    
                    if (!subdirectory.exists()) {
                        subdirectory.mkdir();
                    }
    
                    try {
                        Path sourcePath = Paths.get(file.getAbsolutePath());
                        Path destinationPath = Paths.get(subdirectoryPath + "/" + file.getName());
                        Files.move(sourcePath, destinationPath);
                    } catch (IOException e) {
                        System.out.println("Failed to move file " + file.getName() + " to " + subdirectoryPath);
                    }
                }
            }
    
            System.out.println("All files have been sorted into subdirectories.");
        }
    }
    

    @Swordfish sagte in Dateien sortieren:

    Dateien abhängig von deren Namen

    Wie genau meinste das?



  • ... obwohl man auch dort noch einmal kritisch schauen muss ... Ich hätte das try-catch großräumiger gefasst, und das Ergebnis von mkdir() wird gar nicht geprüft, und eventuell sind da einige Variablendeklarationen überflüssig, und was ist, wenn der erste Buchstabe des Dateinamen etwas Komisches ist?



  • nicht schön aber funzt

    import os
    from datetime import datetime
    import shutil
    
    directory = './'
     
    for filename in os.listdir(directory):
        f = os.path.join(directory, filename)
        if not os.path.isfile(f):
            continue
        
        if filename.startswith('PXL_'):
            filename = filename[4::]
            os.rename(f, os.path.join(directory, filename))
        
        try:
            date = datetime.strptime(filename[0:8], '%Y%m%d') 
        except ValueError:
            continue    
        
        subdir = date.strftime('%Y-%m-%d')
        targetdir = os.path.join(directory, subdir)
        
    
        # if not os.path.exists(targetdir):
        os.makedirs(targetdir, exist_ok = True)  # siehe @wob unten
        targetfile = os.path.join(targetdir, filename)
        shutil.move(f, targetfile)
    


  • Der Code wird in der Regel durch pathlib schöner, wie @Leon0402 das oben vorgemacht hat. Versuche https://docs.python.org/3/library/pathlib.html zu nutzen statt os.

    if not os.path.exists(targetdir):
        os.makedirs(targetdir)
    

    Es könnte ein anderer Prozess in der Zwischenzeit das Verzeichnis erzeugen. Bei Dateisystemoperationen immer: versuchen es zu tun, dann Fehler behandeln.

    Hier einfach: os.makedirs(targetdir, exist_ok=True)

    bzw. mit pathlib: targetdir.mkdir(parents=True, exist_ok=True) (parents=True erstellt dir auch gleich mehrere Subdirs, ggf. nicht nötig hier)



  • @wob sagte in Dateien sortieren:

    Es könnte ein anderer Prozess in der Zwischenzeit das Verzeichnis erzeugen. Bei Dateisystemoperationen immer: versuchen es zu tun, dann Fehler behandeln.

    Außerdem gibt es in Python doch die schöne Regel: it’s easier to ask for forgiveness than permission

    Also macht man in der Regel in Python es eig. immer so rum auch bei anderen sachen 🙂


  • Mod

    Das gilt auch für ALLE anderen Sprachen. Wenn man nicht alleiniger Exklusivbesitzer einer Ressource ist, sind Vorprüfungen eine Race-Condition, die einen früher oder später einholen wird.

    Und selbst als Exklusivbesitzer könnte immer noch der Computer explodieren zwischen Vorprüfung und Ausführung. Aber dann hat man vielleicht andere Probleme 🙂



  • @Leon0402

    Also macht man in der Regel in Python es eig. immer so rum auch bei anderen sachen 🙂

    @SeppJ sagte in Dateien sortieren:

    Das gilt auch für ALLE anderen Sprachen.

    Eben nicht. In vielen Sprachen macht man das nur für Ressourcen oder ähnliche Dinge. In Python verwendet man dieses Pattern viel viel mehr.

    In C++ würdest du eher nicht schreiben:

    try {
       result = my_map.at(key);
    } catch (const std::out_of_range (=KeyError in Python) &e) {
       result = fn_not_exists(key);
    }
    

  • Mod

    Das meinte ich auch nur in Bezug auf geteilte Ressourcen. Aber erstaunlich viele Dinge sind eine geteilte Ressource.



  • @SeppJ sagte in Dateien sortieren:

    Das meinte ich auch nur in Bezug auf geteilte Ressourcen. Aber erstaunlich viele Dinge sind eine geteilte Ressource.

    Es klang aber so als hättest du jemanden korrigiert, der gesagt hätte, dass das nur für Python gelten würde 😃

    Also nochmal: In allen Sprachen für Ressourcen, in Python auch für die meisten anderen Dinge so



  • Dann sind wir uns ja alle einig 🙂



  • @wob @SeppJ Da schreibt sonst niemand. Wenn doch hab' ich andere Probleme.


  • Mod

    @Swordfish sagte in Dateien sortieren:

    @wob @SeppJ Da schreibt sonst niemand. Wenn doch hab' ich andere Probleme.

    Das Trotzdem gute Praxis, immer alles richtig zu machen, dann macht man es ganz natürlich richtig, wenn man mal schwierige Probleme hat.

    Das denken immer alle, das bei ihnen niemals der Ausnahmefall eintreten wird. 6 Monate später ändert sich etwas und Bumm! Was wenn dein eigenes Programm 2x läuft?

    Oder wenn du noch ein Programmlogikargument willst: Was willst du mit der Prüfung überhaupt erreichen, was durch "einfach machen" nicht einfacher und besser abgedeckt ist? Schließlich ist der gefährliche Code ja sogar komplizierter.



  • Ich habe nun ein ähnliches Problem und möchte ein Git-Repo aufräumen. Es gibt pdf-Dateien, txt-Dateien, md-Dateien und jpg-Dateien, alle unsortiert in einem Ordner. Ich möchte nun diese Dateien je nach Endung in entsprechende Unterordner verschieben. Zusätzlich soll es je nach Änderungsdatum Unterordner nach dem Muster yyyy-mm geben, die Dateien sollen also auch nach ihrem Änderungsmonat einsortiert werden. Der Dateiname soll sich nicht ändern.

    Wie mache ich das am geschicktesten? Habe Gitea im Einsatz.



  • @Fragender sagte in Dateien sortieren:

    Habe Gitea im Einsatz.

    Genauer gesagt stehen als Workflow-Werkzeuge Ubuntu, bash und apt zur Verfügung - also alles, was man sich nur wünschen kann! ... Ich bin aber kein bash Profi. 😞

    Gitea hat jetzt Runner integriert. 😉 🍵


Anmelden zum Antworten