Dateien mit Hilfe einer Textdatei sortieren

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
mrsloom
User
Beiträge: 2
Registriert: Donnerstag 26. August 2021, 09:52

Hallo zusammen,

ich habe vermutlich ein ziemlich einfaches Problem, bin leider noch ein Anfänger.

Ich habe einen Ordner voller Dateien (.jpg) und dazu eine .txt-Datei, in dem ein Teil der Dateinamen aus dem Ordner enthalten sind (ohne Endung .jpg). Mein Ziel ist es nun, alle Dateien, die in der Textdatei aufgelistet sind, aus dem Ordner in einen neuen Ordner zu extrahieren/kopieren. Ich weiß bereits, wie ich die .txt-Datei auslesen kann und wie ich mir die einzelnen Dateinamen in eine Liste einfügen kann. Allerdings scheitert es nun daran, wie ich die betreffenden Dateien damit suchen und verschieben kann. Ich habe bereits verschiedene Sachen ausprobiert (mit os, shutil usw.), konnte aber bisher nichts erreichen. Vielleicht hat jemand einen Tipp.


Vielen Dank (:
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte deine Code, in den dazu gedachten Tags (</>-Knopf im vollständigen Editor) posten.
Benutzeravatar
__blackjack__
User
Beiträge: 13121
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Grundgerüst, ohne Fehlerbehandlung falls die Zieldatei beispielsweise schon existiert (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import shutil
from pathlib import Path

SOURCE_PATH = Path("Pfad zu den Bildern")
DESTINATION_PATH = Path("Zielpfad der Bilder")
FILANAMES_FILE_PATH = Path("Pfad zu der Datei mit den Namen/names.txt")


def main():
    with FILANAMES_FILE_PATH.open(encoding="utf-8") as lines:
        for line in lines:
            image_file_path = SOURCE_PATH / (line.strip() + ".jpg")
            if image_file_path.is_file():
                shutil.move(image_file_path, DESTINATION_PATH)


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
mrsloom
User
Beiträge: 2
Registriert: Donnerstag 26. August 2021, 09:52

__blackjack__ hat geschrieben: Donnerstag 26. August 2021, 11:53 Grundgerüst, ohne Fehlerbehandlung falls die Zieldatei beispielsweise schon existiert (ungetestet):

Code: Alles auswählen

#!/usr/bin/env python3
import shutil
from pathlib import Path

SOURCE_PATH = Path("Pfad zu den Bildern")
DESTINATION_PATH = Path("Zielpfad der Bilder")
FILANAMES_FILE_PATH = Path("Pfad zu der Datei mit den Namen/names.txt")


def main():
    with FILANAMES_FILE_PATH.open(encoding="utf-8") as lines:
        for line in lines:
            image_file_path = SOURCE_PATH / (line.strip() + ".jpg")
            if image_file_path.is_file():
                shutil.move(image_file_path, DESTINATION_PATH)


if __name__ == "__main__":
    main()

Vielen Dank für die schnelle Hilfe, es funktioniert perfekt. Ich verwende statt shutil.move nun shutil.copy, da sich das für meine Zwecke besser eignet. (:

Code: Alles auswählen

import shutil
from pathlib import Path

SOURCE_PATH = Path("Pfad zu den Bildern")
DESTINATION_PATH = Path("Zielpfad der Bilder")
FILENAMES_FILE_PATH = Path("Pfad zu der Datei mit den Namen/names.txt")

with FILENAMES_FILE_PATH.open(encoding="utf-8") as lines:
    for line in lines:
        image_file_path = SOURCE_PATH / (line.strip() + ".jpg")
        if image_file_path.is_file():
                shutil.copy(image_file_path, DESTINATION_PATH)
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@__blackjack__: warum verwendest du für den Pfad keinen f-String? -> f"{line.strip()}.jpg"
When we say computer, we mean the electronic computer.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

man kann die runden Klammern auch anders setzen:

Code: Alles auswählen

image_file_path = (SOURCE_PATH / (line.strip()).with_suffix(".jpg")
und wahrscheinlich gibt es noch 999 weitere Möglichkeiten
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@rogerb: Es geht darum dass man Zeichenketten nicht so zusammensetzen sollte, was hier schon min. 999 mal gesagt wurde :-)
When we say computer, we mean the electronic computer.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@sls
...Zeichenketten nicht so zusammensetzen sollte...
und ich habe ja auch nur gesagt, dass es in diesem Fall nicht nötig ist, "+" oder f-String zu nutzen, da die pathlib schon was dafür hat.
Benutzeravatar
__blackjack__
User
Beiträge: 13121
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Ich verwende öfter ``+`` wenn es nur *eine* Operation ist, denn dann spricht da ja nicht wirklich etwas dagegen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@__blackjack___,

wenn ich mich nicht täusche, werden "einfache" + " " + "Operationen" auch schon vom Parser zusammengefügt und der Kompiler sieht sie nur als Ganzes.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

rogerb hat geschrieben: Freitag 27. August 2021, 14:19 wenn ich mich nicht täusche, werden "einfache" + " " + "Operationen" auch schon vom Parser zusammengefügt und der Kompiler sieht sie nur als Ganzes.
Das kann bestenfalls bei einem Ausdruck der nur aus String-Literalen besteht der Fall sein. Ob diese Mikrooptimierung wirklich existiert, weiss ich nicht. Aber schon bei einem simplen

Code: Alles auswählen

a + "b" + "c"
kann der Interpreter bedingt durch Pythons dynamische Natur nichts optimieren. Denn a kann ein Objekt sein, dass einen __add__-Operator ueberladen hat, und nach + "b" wieder ein Objekt liefert, dass dann mit "c" addiert wird. Und dabei beliebige Semantik unterliegen kann, man kann also nicht einfach "bc" zusammenfassen.

Und das liegt hier ja vor. Der Compiler weiss nicht, dass line ein String ist.
Benutzeravatar
sls
User
Beiträge: 480
Registriert: Mittwoch 13. Mai 2015, 23:52
Wohnort: Country country = new Zealand();

@rogerb: ich glaube es ging eher um die Lesbarkeit und die Fehleranfälligkeit von String-Zusammensetzungen. Großartig optimiert wird dabei im Frontend (Übersetzen) von Python nicht, sondern eher zur Laufzeit, wenn ich mich nicht täusche?
When we say computer, we mean the electronic computer.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Lesbarkeit und die Fehleranfälligkeit
Ich weiß, das wurde schon oft diskutiert, und ich würde gewohnheitsmäßig auch die erste Variante verwenden, aber worin besteht denn jetzt deiner Meinung nach der Unterschied bei so etwas?

Code: Alles auswählen

anrede = "Frau"
name = "Schmidt"

#1
f"{anrede} {name}"

# 2
anrede + " " + name
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich finde es (und das ist selbstverstaendlich subjektiv) deutlich klarer. Es sagt mit f"...." einfach sofort das hier ein String erzeugt wird. Wenn ich das ueberlese, um mir in unbekanntem Code ein Bild zu verschaffen, kann ich mich entscheiden, dass einfach links liegen zu lassen.

Ein komplexerer arithmetischer Ausdruck, der ja ueblicherweise auch noch mit str(dies) und str(das) daherkommt, muss man IMHO eben etwas muehseliger durchlesen, bis man zum Schluss kommt, was genau das macht.
Benutzeravatar
__blackjack__
User
Beiträge: 13121
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@rogerb: In #1 sind implizit `str()`-Aufrufe enthalten die bei #2 fehlen. Ist hier nur nicht relevant weil die beiden Werte schon Zeichenketten sind.

Der Fall hier ist ja auch noch übersichtlich, aber wenn davor und danach auch noch Zeichenkettenteile stehen würden, dann wird das halt schnell unübersichtlich. Ohne Syntaxhighlighting kann das bei solchen Ausdrücken dann manchmal schwieriger werden das beim Lesen auseinander zu halten was jetzt eigentlich innerhalb von Zeichenkettenliteralen steht und was ausserhalb.

Edit: Und wo es dann auch interessant wird sind Übersetzungen: Wenn man irgendwann mal anfängt die Anwendung mehrsprachig zu machen, sind grosse Vorlagen in die Daten gefüllt werden, deutlich leichter zu handhaben als lauter kleine Teilstückchen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Natürlich, sobald es über zwei einfache Stringliterale hinausgeht, ist der Fall klar. Aber du hattest ja auch selbst gesagt, dass du das in einfachen Fällen gerne mal "+" zusammenfügst.
Ich finde es ist wichtiger genau zu wissen *warum* man etwas tut, als mit religiöser Hingabe irgendwelche "man macht das so" - Floskeln herunter zu beten.
Antworten