Dateien sortieren
-
@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
-
Dann sind wir uns ja alle einig
-
-
@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.