Minitool mit grafischer Oberfläche - Datein umbennen mit Input aus aus Excel file

Du hast eine Idee für ein Projekt?
Daniel der Anfänger
User
Beiträge: 7
Registriert: Donnerstag 9. Januar 2020, 10:50

Donnerstag 9. Januar 2020, 14:08

Liebe Python Community,

ich würde gerne ein sehr konkretes (allererstes) Anfängerprojekt realisieren.

Ziel dieses Projektes soll es sein, am Ende ein kleines Programm mit grafischer Oberfläche zu erhalten mit welchen Dateien umbenannt werden können, wobei die neuen namen idealerweise aus einer Excel file stammen sollen und bei der Lösung dieser Aufgabe mich näher mit Python 3 zu beschäftigen und daran zu wachsen.

Dieser Beitrag soll hierbei als Dokumentation für das Projekt dienen sowie dem ganzen Struktur geben.
Ein Ideenaustausch zur Projekt Struktur ist willkommen und bei eventuellen Problemen hinsichtlich des Codes erhoffe ich mir konstruktiven Input.
Was ich nicht möchte ist vorgefertigte Lösung/Codes auch wenn ich weiß, dass das Niveau dieser Aufgabe sicherlich für viele erbärmlich ist - aber ich bin halt Neuling.

Als Entwicklungsumgebung benutze ich aktuell PyCharm, als GUI Umgebung würde ich mich gerne mit Qt Designer beschäftigen.
Das Projekt wird in Unterschiedliche Steps unterteilt, sodass ich das Problem (hoffentlich) Stück für Stück lösen kann.
(Dieses Projekt ist keine Hausarbeit noch bin ich Informatikstudent)
einfachTobi
User
Beiträge: 106
Registriert: Mittwoch 13. November 2019, 08:38

Donnerstag 9. Januar 2020, 16:33

Meiner Meinung nach ein sehr gutes Einsteigsprojekt, da du mit vielen Sachen konfrontiert wirst. GUI, Dateizugriff allgemein, Verwendung eines Excel-Moduls im Speziellen, Verarbeitung von Listen. Programmieren lernt man nur durch Programmieren, also keine Scheu vorm Fehler machen und Nachfragen - auch wenn der Ton manchmal etwas harsch ist :). Viel Erfolg.
Daniel der Anfänger
User
Beiträge: 7
Registriert: Donnerstag 9. Januar 2020, 10:50

Freitag 10. Januar 2020, 09:16

Unterteilen würde ich das Projekt gerne in 3 große Arbeitspakete:

1. Reines Python Skript, das auf gewünschte Ornder zugreift, die darin befindlichen Dateien auflistet, und anhand einer Excelfile (in der die neuen Namen gelistet sind) alle Dateien umbenennt.
1.a ) ein Skript, dass auf Ordner zugreift und Dateien auflistet und erstmal in einen str schreibt
1.b) ein Skript, welches Excel im Programmcode einbindet und Daten aus der Tabelle ausliest und reinschreibt
1.c) ein Skript, welches mit Hilfe einer Schleife Unterpunkt a und b automatisiert über alle Dateien in meinem Testordner umbenennt

2. Ein Qt Design, welches eine einfache Grafische Oberfläche enthält mit diversen Funktionen, sodass durch einfaches Bedienen jeder (auch wirklich unbedarfte Nutzer) Dateien umbenennen kann.
2.a) Grundlegendes Ausehen und Funktionen festlegen
2.b) Einfügen der einzelnen Funktionen in Qt Datei

3. Zusammenführen des Codes aus Punkt 1 und Qt Datei aus Punkt 2 zu einem Programm mit grafischer Benutzeröberfläche und als eigenständiges "stand-alone" Programm ablegen.
3.a) Zusammenführen von Punkt 1 und 2 in PyCharm
3.b) Daraus irgendwie ein Programm (.exe?!), dass sich alleine ausführen lässt.
Daniel der Anfänger
User
Beiträge: 7
Registriert: Donnerstag 9. Januar 2020, 10:50

Freitag 10. Januar 2020, 10:03

Arbeitsfortschritt zu 1.a)

Probleme und Lösungen:
1. Zugreifen auf Dateien, benötigt erstmal eine Arbeitsumgebung (Operating System) hierfür ist der Import der Bib. os notwendig
--> Lösung: import os
2. Dateien in einem gewünschten Zielpfad auflisten erfordert erstmal, dass weiß wo die Dateien liegen mit welcher Plattform/Betriebssystem (Windows 10) ich arbeite, damit ich den Dateipfad entsprechend ansprechen kann.
--> Lösung: Befehl os.chdir("Quellpfad") setzt den Quellpfad also da wo die Dateien liegen als Arbeitsumgebung in der gearbeitet wird
--->Lösung: Befehl os.listdir("Quellpfad") sollte nun alle sich im Ordner befindlichen Dateien auflisten
(in dem Testordner befindet sich nur eine .txt File)

Code: Alles auswählen

import os
path = "C:\Users\TEMP\Desktop\Testordner"
os.chdir(path)
os.listdir(path)
...ausgeführt wird der Code und es kommt error code 0, dass ist ja schonmal gut, es sollte also alles geklappt haben jedoch wird mit die .txt-File nicht angezeigt.
Sirius3
User
Beiträge: 11629
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 10. Januar 2020, 10:12

Das was Du da Skript nennst, würde ich Funktion nennen. Zum Zugriff auf Ordner gibt es das pathlib-Modul. chdir hat in einem ordentlichen Programm nichts verloren, weil es einen globalen Zustand (Arbeitsverzeichnis) ändert.
Benutzeravatar
__blackjack__
User
Beiträge: 5555
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 10. Januar 2020, 12:00

@Daniel der Anfänger: Das der Code fehlerfrei läuft mag ich nicht glauben denn da ist ein Syntaxfehler in der Zeichenkette mit dem Pfad:

Code: Alles auswählen

In [6]: "C:\Users\TEMP\Desktop\Testordner"                                      
  File "<ipython-input-6-f99abc8f3709>", line 1
    "C:\Users\TEMP\Desktop\Testordner"
                                      ^
SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape
Ad 1.a) Dateien auflisten und erstmal in einen `str` schreiben ist nicht zielführend, denn für die Weiterverarbeitung braucht man die ganze Namen ja nicht als *eine* Zeichenkette sondern einzeln. Also zum Beispiel eine Liste mit den ganzen Namen. Beziehungsweise `pathlib.Path`-Objekte, denn das mit Zeichenketten und `os`/`os.path` zu machen ist etwas ”altmodisch”.

Vor den Importen sollte die She-Bang-Zeile kommen. Auch unter Windows, denn auch dort ist die sinnvoll, weil man mehrere Pythonversionen installiert haben kann, Python-Dateien mit py.exe verknüpft sind, und dieses Programm dann anhand der Zeile entscheiden kann welches Python tatsächlich verwendet wird für die jeweilige Datei.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst und die davor geschützt wird aufgerufen zu werden wenn man das Programm als Modul importiert. Also das minimale Grundgerüst für ein Programm sieht ungefähr so aus:

Code: Alles auswählen

#!/usr/bin/env python3


def main():
    ...


if __name__ == "__main__":
    main()
Konstanten werden per Konvention KOMPLETT_GROSS geschrieben.

`os.chdir()` verwendet man nicht nur nicht, das macht hier auch gar keinen Sinn, da es auf den Rest des Code gar keinen Effekt hat. Das kann man einfach ersatzlos entfernen ohne das sich etwas am Verhalten des Programms ändert.

Die Textdatei wird nicht angezeigt weil nirgends im Code steht das die angezeigt werden soll. `os.listdir()` liefert eine Liste mit den Namen. Damit kann man alles mögliche machen, unter anderem könnte man sie auch ausgeben lassen. Aber das muss man dann auch explizit *tun*. Python rät da nicht irgendwie rum was man denn tatsächlich machen wollte wenn man nichts sinnvolles mit einem Ergebnis eines Ausdrucks macht. Das ”rechnet” dann einfach das Ergebnis aus und macht dann *nichts* damit, genau so wie es der Programmierer geschrieben hat.

Zwischenstand:

Code: Alles auswählen

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

PATH = Path(r"C:\Users\TEMP\Desktop\Testordner")


def main():
    list(PATH.iterdir())


if __name__ == "__main__":
    main()
Das macht jetzt im Grunde das gleiche wie Dein Code. Wenn man etwas auf der Konsole ausgeben möchte, könnte man das beispielsweise mit `print()` machen.
long long ago; /* in a galaxy far far away */
Daniel der Anfänger
User
Beiträge: 7
Registriert: Donnerstag 9. Januar 2020, 10:50

Freitag 10. Januar 2020, 15:34

@Sirius3: Vielen Dank für den Hinweis mit dem Arbeitsverzeichnis, ja du hast recht ich hab einen ähnlichen "Fehler" schonmal mit einen R Skript von mir gemacht -was später dann nichtmehr richtig funktioniert hat wegen einer falschen Zuweisung - das war ziemlich nervig. Ich danke Dir für deinen Input!

@__blackjack__: Auch Dir vielen Dank für deinen massiven konstruktiven Input!
- Ja da hat sich bei mir ein Syntaxfehler mit den /\ beim schnellen abtippen eingeschlichen.
Das Problem mit dem Output generieren habe ich zwischenzeitlich selbst gelöst, auch ist mir das mit dem nicht Code relevanten os.chdir völlig irrelevant ist.

Zwischenzeitlich habe ich das so umgeschrieben:

Code: Alles auswählen

import os

path ="C:/Users/TEMP/Desktop/Testordner"		# Variable, definiert meinen Quellpfad des Zielordners
inhalt = os.listdir(path)		# schreibt in Variable "inhalt" eine Liste (String) des Zielordners
print (inhalt)		# gibt den den String "inhalt" wieder
altername = inhalt[0]		# weist Variable "altername" den den Inhalt des Str "inhalt" an 1. Stelle (also an 0ter) zu
neuername = "umbenannt.txt" 		# weist einer Variablen "neuername"  den Text "umbenannt.txt zu
print(altername)		# ausgeben  der Variablen "altername" welches inhalt[0] sein wird
print(neuername)		# ausgeben der Variablen "neuername"
os.rename(altername, neuername)		# nennt altername ind neuername um # klappt nicht weil rename()Pfade benötigt?!
print(inhalt)		# sollte neue inhalt ausgeben um zu prüfen ob das geklappt hat
Ich denke ihr seht wie ich nacher die Schleife integrieren wollte, um damit das Umbennen mit mehreren Dateien funktioniert (hoffentlich) - soweit bin ich ja noch nicht.

Ich werde aber erstmal deinen Beitrag fertig durcharbeiten, den Code so formatieren, dass es einem vernünftigem Programmcode entspricht und dann das neue Ergebnis (was hoffentlich besser ist) posten --> aber erstmal alles verstehen was du geschrieben hast und den Syntax lernen sowie die Fuktionen von des path Moduls kennenlernen.
Sirius3
User
Beiträge: 11629
Registriert: Sonntag 21. Oktober 2012, 17:20

Freitag 10. Januar 2020, 15:51

Das funktioniert nicht, weil os.listdir nur die Dateinamen liefert, nicht aber den Pfad dorthin. Das hast Du ja schon in Deinem Kommentar geschrieben. Aber die restlichen Kommentare sind überflüssig, da sie nur beschreiben, was ohnehin schon im Code steht.
` os` ist zu low-level und sollte nicht benutzt werden. Benutze pathlib. Das hat auch eine rename-Methode.
Benutzeravatar
__blackjack__
User
Beiträge: 5555
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 10. Januar 2020, 17:03

Noch als Hinweis: `os.listdir()` garantiert keine Reihenfolge der Ergebnisse, auch wenn das vielleicht so aussehen mag. Die Ergebnisse stehen da so drin wie sie vom Betriebssystem geliefert werden und das hängt vom Betriebssystem und vom jeweiligen Dateisystem ab. Da kann man Glück haben das die beispielsweise in alphabetischer Reihenfolge kommen, aber die könnten auch in der Reihenfolge kommen in der die Dateien angelegt wurden oder in einer scheinbar zufälligen Reihenfolge. Das erste Ergebnis einer solchen Liste umzubenennen ist also im Grund eine zufällige Datei aus dem Verzeichnis umzubenennen. Kann man sich überlegen ob oder wann das sinnvoll sein mag.

Selbst wenn `os.listdir()` scheinbar sortierte Ergebnisse liefert, muss diese Sortierung übrigens nicht mit der Anzeige in einem Dateimanager oder bei einem ``dir`` in der Konsole übereinstimmen, denn der dahinter liegende Grund ist ein anderer. Wenn das vom Dateisystemtreiber sortiert geliefert wird, dann ist der Grund in der Regel das die Dateien auf dem Hintergrundspeicher als Suchbaum organisiert sind, also die Namen als Bytefolgen sortiert sind. Während sortierte Dateilisten, die einem in Dateimanagern angezeigt werden, die eingestellte Locale berücksichtigen und in aller Regel auch Ziffernfolgen ”natürlich” und nicht rein lexikografisch sortiert sind.

Worauf ich hinaus will: Du musst selbst dafür sorgen das die Daten so sortiert werden wie Du das brauchst, auch wenn es den Anschein haben könnte das wäre nicht nötig.

Wenn man sowieso nur *einen* Eintrag umbenennen möchte (übrigens auch ohne zu prüfen ob das eine Datei oder ein weiteres Verzeichnis ist), dann wäre es effizienter sich den pseudozufälligen Eintrag per `os.scandir()` liefern zu lassen statt auch alle anderen Einträge aufzulisten die man gar nicht verarbeitet.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import os


def main():
    path = "C:/Users/TEMP/Desktop/Testordner"
    with os.scandir(path) as dir_entries:
        alter_pfad = next(dir_entries).path
    os.rename(alter_pfad, os.path.join(path, "umbenannt.txt"))


if __name__ == "__main__":
    main()
Wie gesagt, ist als Programm wenig sinnvoll *irgendeinen* Eintrag umzubenennen, insbesondere wenn der auch ein Verzeichnis sein kann. Und es wird hier auch nicht geprüft ob überhaupt ein Eintrag vorhanden ist. In dem Falle wäre Dein Programm auch mit einer Ausnahme ausgestiegen.
long long ago; /* in a galaxy far far away */
Daniel der Anfänger
User
Beiträge: 7
Registriert: Donnerstag 9. Januar 2020, 10:50

Sonntag 12. Januar 2020, 15:23

Hallo ihr Beiden, pathlib. ist jetzt gesetzt, ich hätte aber doch noch einigen Fragen bezüglich eurer Hinweise bzw. Anmerkungen:

@Sirius3: globale Änderungen wie das Arbeitsverzeichnis zu wechseln ist nicht besonders clever, es kann gerade bei einem Anfänger zu deutlichen Komplikationen führen.
Der Befehl os.chdir wechselt dieses Arbeitsverzeichnis. Ich habe online mehrere Codelines gefunden bei denen mit Pathlib ähnlich vorgegangen wird wie ich es mit dem os.chdir (zum auflisten der Dateinamen) gemacht habe. Nach meinem Verständnis müsste os.chdir = Path.cwd sein? Ist das korrekt? Wenn ja was genau ist der Unterschied zwischen path.home(), path.cwd()? Das wird ja nicht das Gleiche sein.
Ich gehe davon aus, dass weder path.cwd noch path.home sinnvoll ist für meine Problemlösung, sonst wären eure Input zu meinen ersten Posts anders ausgefallen.

@__blackjack__: Das mit der Reihenfolge ist natürlich jetzt ein Riesenproblem. Woher weiß ich denn wie das System die Daten anliefert - ich muss jetzt aber nicht wissen auf welches Festplattensektoren der Kram evtl liegt oder?
Um das Problem was ich lösen möchte zu konkretisieren: Ich werde nacher Bilderdateien umbennen die nach folgendem Schema gelistet sein sollen IMG1001, IMG1002, IMG1003, IMG100n. Später soll daraus sowas werden wie: Variante 1 A, Variante 1 B, Variante 1 C, Variante 1 D.
[Es handelt sich hierbei um Bilddateien von Versuchspflanzen die zu Dokumentationszwecken vernünftig beschriftet sein sollen - ist für meine Diss. und wenn man 400+ Bilder händisch beschriften müsste wird man ja verrückt]
--> d.h. ein alphabetisches sortieren der Quelldateien löst mir mein Problem, ich glaube einfach mal, dass das nicht ganz so schwierig ist.

Frage bezüglich deines Codes:

Code: Alles auswählen

#!/usr/bin/env python3 
import os


def main():	
    path = "C:/Users/TEMP/Desktop/Testordner" 
    with os.scandir(path) as dir_entries:	# os.scan() Iterator der listet Daten im Quellordner auf; dir_entries = Variable?!
        alter_pfad = next(dir_entries).path	# nex()- funktion die die liste chronologisch abarbeitet, was genau macht ".path"
    os.rename(alter_pfad, os.path.join(path, "umbenannt.txt")) # os.path.join hier ist*.path.join doch jetzt die path-funktion oder und das...join(path, ...) da ist path meine Variable path oder, nur damit ich den Syntax gleixch richtig lerne. Wenn das so ist solte ich Variablen nicht wie Funktionen nennen?!


if __name__ == "__main__":
    main()
Sirius3
User
Beiträge: 11629
Registriert: Sonntag 21. Oktober 2012, 17:20

Sonntag 12. Januar 2020, 15:36

Die Frage bleibt ja, wie Du weißt, dass IMG1003 Variante C ist? Woher kommen die Namen der Varianten und wie sind die mit den Bildern verknüpft?
`home` ist das Heimatverzeichnis und `cwd` ist das current working directory, also das Arbeitsverzeichnis. Wenn Dein festes Verzeichnis eigentlich relativ zur Heimat ist, dann nutze das:

Code: Alles auswählen

image_path = Path.home() / "Desktop" / "Testordner"
Benutzeravatar
__blackjack__
User
Beiträge: 5555
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Sonntag 12. Januar 2020, 17:11

@Daniel der Anfänger: Nein, `os.chdir()` ist nicht das gleiche wie `Path.cwd()` — das eine ändert das aktuelle Arbeitsverzeichnis des Prozesses, das andere fragt es ab.

`Path.home()` liefert das Heimatverzeichnis die aktuellen Benutzers, während `Path.cwd()` das aktuelle Arbeitsverzeichnis des Prozesses liefert. Das Heimatverzeichnis für einen Benutzer ist für alle Prozesse gleich. Das ist das Verzeichnis in dem der angemeldete Benutzer normalerweise seine eigenen Dateien ablegt. Das Heimatverzeichnis nehmen die Funktionen des Systems für nichts, wenn man das irgendwo haben will muss man das abfragen und einen Pfad daraus basteln. Das aktuelle Arbeitsverzeichnis wird von den Funktionen vom System als Basis für jede relative Pfadangabe verwendet. Deswegen ist die Abfrage per `Path.cwd()` oder `os.getcwd()` auch eher selten.

Und richtig Du brauchst weger `Path.home()` noch `Path.cwd()` in Deinem Beispiel, denn Du hast da ja bereits einen kompletten Pfad vorgegeben.

Du weisst nicht in welcher Reihenfolge das System die Namen liefert. Deswegen habe ich das ja erwähnt das Du selbst dafür sorgen musst, das die in der Reihenfolge sind in der Du sie brauchst. Einfache lexikografische Sortierung sollte in der Tat bei Dateinamen wie sie üblicherweise von Digitalkameras erzeugt werden, ausreichen. Bleibt die Frage nach welchem Muster die umbenannt werden sollen, denn das was Du da andeutest mit den Buchstaben könnte bei 26 Buchstaben und 400 Dateien nicht ganz aufgehen. ;-)

`os.scandir()` liefert einen Iterator/Generator der dann an den Namen `dir_entries` gebunden wird und der Objekte für einzelne Verzeichniseinträge liefert. Und so ein Objekt für einen Verzeichniseintrag hat unter anderem ein `path`-Attribut mit dem Pfad des Eintrags.

Mit dem `next()` wird weder eine Liste abgearbeitet, noch chronologisch. Das wird genau *ein* Element von dem Iterator/Generator abgefragt und zwar das erste was das Betriebssystem da halt so liefert. Und davon wird dann das `path`-Attribut genommen und an den Namen `alter_pfad` gebunden.

Das kann man aber auch alles in der Dokumentation nachlesen und/oder einfach mal ausprobieren:

Code: Alles auswählen

In [12]: path = "tmp"                                                           

In [13]: dir_entries = os.scandir(path)                                         

In [14]: dir_entries                                                            
Out[14]: <posix.ScandirIterator at 0x7f434845a810>

In [15]: entry = next(dir_entries)                                              

In [16]: entry                                                                  
Out[16]: <DirEntry 'forum'>

In [17]: entry.path                                                             
Out[17]: 'tmp/forum'

In [18]: dir_entries.close()
Bei der Frage im Kommentar zur letzten Zeile muss ich passen, die habe ich nicht wirklich verstanden.

Das ist aber für Dein Problem nicht wirklich relevant, weil `os.scandir()` ziemlich low-level ist.
long long ago; /* in a galaxy far far away */
Daniel der Anfänger
User
Beiträge: 7
Registriert: Donnerstag 9. Januar 2020, 10:50

Sonntag 12. Januar 2020, 17:18

Sirius3 hat geschrieben:
Sonntag 12. Januar 2020, 15:36
Die Frage bleibt ja, wie Du weißt, dass IMG1003 Variante C ist? Woher kommen die Namen der Varianten und wie sind die mit den Bildern verknüpft?
`home` ist das Heimatverzeichnis und `cwd` ist das current working directory, also das Arbeitsverzeichnis. Wenn Dein festes Verzeichnis eigentlich relativ zur Heimat ist, dann nutze das:

Code: Alles auswählen

image_path = Path.home() / "Desktop" / "Testordner"
Das ist ganz einfach ich fotografiere immer in definierter Reihenfolge entweder Wiederholungsweise. Und egal welche Spiegelreflex ich nehme alle sind so eingestellt , das die Bilderdateien fortlaufen nummeriert werden. Das ist also kein Problem. Da ich nach pflanzenanzahl x entsprechend immer mal ein Leerbild mache kann ich Verwechslungen die beim Fotografieren passieren auch zurückverfolgen etc.
Daniel der Anfänger
User
Beiträge: 7
Registriert: Donnerstag 9. Januar 2020, 10:50

Donnerstag 13. Februar 2020, 01:52

So die ersten Gehversuche mit pathlib und ich bekomme das Kotzen ..

Code: Alles auswählen

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

Quellpfad: str = "E:/Fileordner"

A = Path(Quellpfad)

if A.exists() == True:
    print("Datei gefunden")

elif A.exists() == False:
    print("Fehler Pfad existiert nicht")

#Filepfade auflisten

for Filenamen in A.iterdir():
    print(Filenamen)		#Bis hier haben die einzelnen Parts geklappt.

## Umbenennen
for Filenamen in A.iterdir():
     if Filenamen.is_file():
        old_name = Filenamen.stem
        old_extension = Filenamen.suffix
        directory = Filenamen.parent
        new_name = "text" + old_name + old_extension
        Filenamen.rename(A.Path(directory, new_name))

Folgender Fehlercode kommt:

Traceback (most recent call last):
File "C:/Users/Daniel/PycharmProjects/untitled1/1. Versuch.py", line 26, in <module>
Filenamen.rename(A.Path(directory, new_name))
AttributeError: 'WindowsPath' object has no attribute 'Path'

Irgendwie hat mir das Googeln des Errors nicht weitergeholfen ich versteh es es einfach nicht entweder WindowsPath ist nicht "callable " oder ich bekomme den oben genannten Fehler.. und alles in str umwandeln klappt nicht... Arghhh....
Sirius3
User
Beiträge: 11629
Registriert: Sonntag 21. Oktober 2012, 17:20

Donnerstag 13. Februar 2020, 06:27

Namenskonvention ist, dass Variablen komplett klein und Konstanten komplett gross geschrieben werden. QUELLPFAD wird ein String zugewiesen. Warum schreibst Du das nochmal mit :str hin? Weg damit. Außerdem sollte das gleich ein Pathobjekt sein. A ist nämlich ein äußerst schlechter Name, wie alle einbuchstabigen Variablennamen, weil sie dem Leser nichts sagen. Explizit auf True prüfen bringt nichts neues kann also weg gelassen werden. Auf False prüft man mit not. Wenn die elif-Bedingung das genaue Gegenteil der if-Bedingung ist, benutzt man else. Im Fehlerfall machst du weiter als wäre nichts passiert, was dazu führt, dass das Programm bei iterdir mit einem Error abbricht. Da kannst du dir die Prüfung davor auch sparen. iterdir liefert in der for-Schleife jeweils einen Pfad, nicht mehrere Filenamen. Dann wechselst du plötzlich auf englische Bezeichner. Entscheide dich für eine Sprache. Warum denkst du, das A als Pfadobjekt das Attribut Path hat? directory ist bereits ein Pfadobjekt, man kann also mit / den Dateinamen amhängen.

Code: Alles auswählen

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

QUELLPFAD = Path("E:/Fileordner")

if not QUELLPFAD.exists():
    print("Fehler Pfad existiert nicht")
else:
    print("Datei gefunden")
    for filename in QUELLPFAD.iterdir():
        print(filename)
        if filename.is_file():
            directory = filename.parent
            new_name = f"text{filename.stem}{filename.suffix}"
            filename.rename(directory / new_name)
Antworten