Dateien sortieren



  • Hy
    Ich will Dateien abhängig von deren Namen in Unterordner einsortieren. Womit mach' ich das am blödesten? Python?



  • Was für eine Abhängigkeit ist das? Wie soll man dir am besten helfen?

    Um deine Frage zu beantworten:

    Womit mach' ich das am blödesten? Python?

    Nein, Python ist hier nicht die blödeste Wahl. Das in Assembler zu erledigen, wäre definitiv blöder. Wobei: wer weiß, auf was für einem Gerät / Dateisystem du das machen willst...


  • Mod

    Wenn man Bing AI fragt, ohne eine Sprache zu nennen, schreibt es Python:

    Certainly! Here's a Python program that sorts files into folders depending on their name:

    import os
    import shutil
    
    # Set the path of the directory containing files
    path = "C:/Users/username/Desktop/files"
    
    # Loop through all files in the directory
    for filename in os.listdir(path):
        # Get the first character of the filename
        first_char = filename[0]
        # Create a new directory with that character as its name
        new_dir = os.path.join(path, first_char)
        os.makedirs(new_dir, exist_ok=True)
        # Move the file to that directory
        old_file_path = os.path.join(path, filename)
        new_file_path = os.path.join(new_dir, filename)
        shutil.move(old_file_path, new_file_path)
    

    This program sorts files into folders based on their first character. You can modify it to sort files based on any other criteria you like by changing the line that sets first_char. For example, you could sort files based on their extension by using os.path.splitext(filename)[1] instead of filename[0].

    I hope this helps!

    Source: Conversation with Bing, 19/04/2023
    (1) How to sort files into corresponding folders based on file name?. https://stackoverflow.com/questions/72640028/how-to-sort-files-into-corresponding-folders-based-on-file-name.
    (2) How to sort files into folders, according to file names - Windows CMD. https://superuser.com/questions/1328200/how-to-sort-files-into-folders-according-to-file-names-windows-cmd.
    (3) string - Batch File Help: Sorting files into specifically-named folders .... https://stackoverflow.com/questions/63799300/batch-file-help-sorting-files-into-specifically-named-folders-based-on-filename.


  • Mod

    PS: Bei der Frage nach der schlechtesten Sprache hat es C gewählt:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char *argv[]) {
        char *filename = "example.txt";
        char first_char = filename[0];
        char dirname[256];
        sprintf(dirname, "%c", first_char);
        mkdir(dirname);
        char command[256];
        sprintf(command, "mv %s %s", filename, dirname);
        system(command);
        return 0;
    }
    

    Tut sich IMHO erschreckend wenig gegenüber der Pythonversion.

    Bei der Frage nach einem Assemblerprogramm hat es tatsächlich eine Antwort verweigert, weil es ihm zu viel Arbeit gewesen wäre 😃



  • @SeppJ Danke. Ich hab's mir eh gedacht. Dann mach' ich mal. Ich muss mich erst daran gewöhnen als erstes mal ChatGPT zu fragne.


  • Mod

    @Swordfish sagte in Dateien sortieren:

    @SeppJ Danke. Ich hab's mir eh gedacht. Dann mach' ich mal. Ich muss mich erst daran gewöhnen als erstes mal ChatGPT zu fragne.

    Ja, für so Programme, die ein Könner ohne Nachdenken runterschreiben könnte, und man einfach nur zu faul oder kein Könner ist, ist das echt super und miene erste Wahl geworden. Programme wo ein Könner nachdenken müsste habe ich aber bisher noch nicht hinbekommen, ohne kräftig mitzuhelfen. Wofür ich die Lösung logischerweise schon kennen muss, und am Ende ist es sogar mehr Arbeit als es direkt selbst zu schreiben.



  • @SeppJ sagte in Dateien sortieren:

    Wenn man Bing AI fragt, ohne eine Sprache zu nennen, schreibt es Python:

    Certainly! Here's a Python program that sorts files into folders depending on their name:

    import os
    import shutil
    
    # Set the path of the directory containing files
    path = "C:/Users/username/Desktop/files"
    
    # Loop through all files in the directory
    for filename in os.listdir(path):
        # Get the first character of the filename
        first_char = filename[0]
        # Create a new directory with that character as its name
        new_dir = os.path.join(path, first_char)
        os.makedirs(new_dir, exist_ok=True)
        # Move the file to that directory
        old_file_path = os.path.join(path, filename)
        new_file_path = os.path.join(new_dir, filename)
        shutil.move(old_file_path, new_file_path)
    

    This program sorts files into folders based on their first character. You can modify it to sort files based on any other criteria you like by changing the line that sets first_char. For example, you could sort files based on their extension by using os.path.splitext(filename)[1] instead of filename[0].

    I hope this helps!

    Source: Conversation with Bing, 19/04/2023
    (1) How to sort files into corresponding folders based on file name?. https://stackoverflow.com/questions/72640028/how-to-sort-files-into-corresponding-folders-based-on-file-name.
    (2) How to sort files into folders, according to file names - Windows CMD. https://superuser.com/questions/1328200/how-to-sort-files-into-folders-according-to-file-names-windows-cmd.
    (3) string - Batch File Help: Sorting files into specifically-named folders .... https://stackoverflow.com/questions/63799300/batch-file-help-sorting-files-into-specifically-named-folders-based-on-filename.

    import shutil
    from pathlib import Path
    
    # Set the path of the directory containing files
    path = Path("C:/Users/username/Desktop/files")
    
    # Loop through all files in the directory
    for file_path in path.iterdir():
        # Check if the path is a file
        if file_path.is_file():
            # Get the first character of the filename
            first_char = file_path.name[0]
            # Create a new directory with that character as its name
            new_dir = path / first_char
            new_dir.mkdir(parents=True, exist_ok=True)
            # Move the file to that directory
            new_file_path = new_dir / file_path.name
            shutil.move(file_path, new_file_path)
    

    ChatGpt kann das auch mit modernen Features wie der pathlib. Man muss nur leider explizit danach fragen. Kann man jetzt natürlich alles noch bisschen umschreiben und schöner machen.

    @SeppJ sagte in Dateien sortieren:

    Tut sich IMHO erschreckend wenig gegenüber der Pythonversion.

    Uhm findest du? Also ich finde die Unterschiede schon relativ deutlich. Angefangen damit, dass hier einfach Terminal Befehle ausgeführt werden, sprich das ganze tendenziell systemabhängig ist.


  • Mod

    @Leon0402 sagte in Dateien sortieren:

    @SeppJ sagte in Dateien sortieren:

    Tut sich IMHO erschreckend wenig gegenüber der Pythonversion.

    Uhm findest du? Also ich finde die Unterschiede schon relativ deutlich. Angefangen damit, dass hier einfach Terminal Befehle ausgeführt werden, sprich das ganze tendenziell systemabhängig ist.

    Ich meinte vom Aufbau, Länge und Stil her. Es ist nahezu Zeile für Zeile das gleiche Programm. Wenn man die Denkpfade dahinter im Details nachvollziehen würde, würde es mich auch nicht wundern, wenn das KI-intern effektiv als die Übersetzung des gleichen Grundgerüsts nach Python bzw. C entstanden ist.

    Funktional ist es deutlich schlechter, ja. Da müsste man in C das ganze Pfad-Geraffel und die rename/copy-Logik hinter shutil.move (oder dem OS mv) nachbauen, und das für alle Plattformen. Hat in Python schönerweise schon jemand für uns gemacht, aber wird sicherlich ähnlich aussehen wie die vollständige C-Version, wenn man in die Implementierung hinter shutil/pathlib guckt.


  • Mod

    @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.



  • @SeppJ @Leon0402 @wob Danke für Eure Kommentare. Werkzeug wird wohl Python sein. Hab' ich halt zuletzt zu Symbianzeiten gemacht, also keine Übung darin. Aber ich bekomm' das schon hin.

    PS: Ach so ... KI ... ne, ich mach's lieber selber. Anregungen werd' ich mir holen.



  • @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


Anmelden zum Antworten