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...
-
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 usingos.path.splitext(filename)[1]
instead offilename[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.
-
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.
-
@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 usingos.path.splitext(filename)[1]
instead offilename[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.
-
@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 OSmv
) 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.
-
@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
- nicht das gewünschte Verhalten
- 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
- nicht das gewünschte Verhalten
- 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 stattos
.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
-
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
-
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); }
-
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