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 (:
Dateien mit Hilfe einer Textdatei sortieren
- __blackjack__
- User
- Beiträge: 13268
- 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()
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
__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)
man kann die runden Klammern auch anders setzen:
und wahrscheinlich gibt es noch 999 weitere Möglichkeiten
Code: Alles auswählen
image_file_path = (SOURCE_PATH / (line.strip()).with_suffix(".jpg")
- __blackjack__
- User
- Beiträge: 13268
- 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.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
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"
Und das liegt hier ja vor. Der Compiler weiss nicht, dass line ein String ist.
- 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.
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?Lesbarkeit und die Fehleranfälligkeit
Code: Alles auswählen
anrede = "Frau"
name = "Schmidt"
#1
f"{anrede} {name}"
# 2
anrede + " " + name
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.
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.
- __blackjack__
- User
- Beiträge: 13268
- 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.
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.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
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.
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.