Änderung PDF Namen

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.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Datei befindet sich ja auch im Verzeichnis P:/KA Hauptordner/Empfang/Ordner Bebbi/Bestellungen, Du mußt schon den absoluten Pfad angeben.
Damit solche Fehler erst gar nicht passieren können, sollte man nicht die low-level-Funktionen aus os benutzen, sondern pathlib.

Code: Alles auswählen

from pathlib import Path

BESTELL_PATH = Path('P:/KA Hauptordner/Empfang/Ordner Bebbi/Bestellungen')
for filename in BESTELL_PATH.iterdir():
    date, name, num, can1, can2 = filename.stem.split('_')
    name = name.replace('red', 'rot')
    filename.rename(filename.with_name('{}_{}_{}{}'.format(date, name, num, filename.suffix))
PS: Konstanten schreibt man komplett gross.
Das ist nicht genau das, was Du gemacht hast, weil bei dem gezeigten Code gibt es einen SyntaxFehler.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bebbi: Ich bin bei der Vermutung mit dem ``+`` halt davon ausgegangen, dass Du den Fehler korrekt beschrieben hast. Du hast ja geschrieben das die Fehlermeldung sagen würde „das er die angegebene Datei "20200507-Color_red-15289.pdf 20200507-Color-rot-15289" nicht finden kann“. Und so ein Dateiname, der ja aus beiden Namen besteht, könnte halt nur entstehen wenn man die beiden Dateienamen selbst im Code, beispielsweise mit ``+``, zusammenfügt.

Die tatsächliche Fehlermeldung enthält aber *zwei* Dateinamen: den alten, gefolgt von einem ”Pfeil” (``->``) und den neuen: '20200507-Color_red-15289' -> '20200507-Color_rot-15289'. Im Gegensatz zu Deiner Behauptung endet der alte auch gar nicht mit ".pdf", das heisst selbst wenn die PDF-Datei im aktuellen Arbeitsverzeichnis liegen würde, käme genau diese Fehlermeldung.

Der gezeigte Code passt auch nicht zur Fehlermeldung, denn in Zeile 8 steht dort nicht das `os.replace()` aus dem Traceback, sondern ein `print()`-Aufruf.

Du solltest am besten immer den Code zeigen der auch tatsächlich zur Ausnahme geführt hat, und auch die tatsächliche Ausnahme 1:1 kopieren und nicht so ungefähr umschreiben. Sonst müssen wir raten und/oder gehen von falschen Annahmen aus. Beides hilft nicht wirklich beim helfen.

Insgesamt hilft mehr Präzision beim Beschreiben des Problems auch beim Programmieren. Denn während wir menschlichen Helfer noch ein bisschen mitdenken und Lücken durch ein bisschen Nachdenken füllen können, ist so ein Rechner extrem dumm und macht immer nur exakt was man sagt, nie was man eigentlich meinte, solange das nicht auch tatsächlich das ist, was man exakt sagt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Stimmt, ich bin ziemlich verwirrt. Der Einstieg ins Programmieren ist nicht ohne.... Ich habe am Wochenende versucht das Ganze zu verbessern, wie man sieht erfolglos...

Der Code sieht momentan wie folgt aus:

Code: Alles auswählen

import os

Umwandlung = 'P:/Key Advisors Hauptordner/Empfang/Ordner Bebbi/Bestellungen'
for filename in os.listdir(Umwandlung):
    basename, extension = os.path.splitext(filename)
    date, name, num, can1, can2 = basename.split('_')
    name = name.replace('red', 'rot')
    print(filename, '{}_{}_{}'.format(date, name, num))
[Code]

Die Medlung kommt nun wie folgt (kopiert und sollte nun stimmen):

========= RESTART: C:\Users\SM\AppData\Local\Programs\Python\Python38-32\rename_test_1.py ========
20200430_Color_red_1622244-001_6396015_000000.pdf 20200430_Color_rot_1622244-001
20200430_Color_red_1622287-001_6396012_000000.pdf 20200430_Color_rot_1622287-001
20200430_Color_red_1622564-001_6396014_000000.pdf 20200430_Color_rot_1622564-001
20200430_Color_red_1625009-001_6396011_000000.pdf 20200430_Color_rot_1625009-001
20200430_Color_red_1627843-001_6396013_000000.pdf 20200430_Color_rot_1627843-001
20200430_Color_red_40672361-001_6396016_000000.pdf 20200430_Color_rot_40672361-001
20200430_Color_red_40685701-001_6396020_000000.pdf 20200430_Color_rot_40685701-001
20200430_Color_red_40688541-001_6396018_000000.pdf 20200430_Color_rot_40688541-001
>>>

Die umzuschreibenden Dateien befinden sich alle im unter folgendem Pfad: P:/Key Advisors Hauptordner/Empfang/Ordner Bebbi/Bestellungen => dieser ist doch vollständig oder nicht? Python findet ja die Dateien auch, dies sogar mit dem benutzten os. Muss für pathlib eine andere Bibliothek importiert werden?

Ich bin mir bewusst, dass die Fragen für Euch sehr dumm rüberkommen. Ich habe einfach die Basics noch nicht drin...
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bebbi: `os.listdir()` liefert nur die Namen die in dem Pfad liegen, ohne den Pfad. Das heisst wenn Du einen Namen aus einem ``os.listdir(some_path)`` hast, und die Datei beispielsweise öffnen willst, dann reicht nicht der Name ohne Pfad, sondern man muss dann natürlich auch wieder dafür sorgen, dass `some_path` vor den Namen gesetzt wird.

`pathlib` ist wie `os` ein Modul aus der Standardbibliothek, muss also nicht extra installiert werden. Das hat eine objektorientierte API die es erlaubt in der Regel leichter lesbaren/verstandlichen Code zu schreiben. Zum Beispiel in dem verschiedene Teile des Pfades als Attribute zur Verfügung stehen oder das es Methoden wie `with_name()` gibt. Das kann man auch alles mit den `os`/`os.path`-Funktionen machen, da würde man `stem` aber beispielsweise durch zwei Funktionsaufrufe ausdrücken müssen wo erst Basispfad vom Namen und dann Name von Dateinamenserweiterung getrennt wird.

Da Du anscheinend nur PDF-Dateien verarbeiten willst, würde ich nicht `Path.iterdir()` oder `os.listdir()` verwenden, sondern `Path.glob()` oder das `glob`-Modul. Es passiert immer mal das auf irgendeine Weise andere Dateien in einem Ordner entstehen. Beispielsweise Sicherungskopien von bearbeiteten Dateien, (versteckte) Dateien die Informationen über die Darstellung des Ordners in einem Programm enthalten, Dateien oder Verzeichnisse mit Thumbnails wenn man das Verzeichnis mal mit einem Bildbetrachtungsprogramm oder Dateimanager geöffnet hat der so etwas anlegt, …

Edit: Da Du Informationen aus dem Dateinamen entfernst, würde ich bei so etwas noch einen Test einbauen ob der kürzere Zielname dann eindeutig ist, also ob es die Datei noch nicht gibt. So etwas führt sonst nämlich zu Datenverlusten wenn mehrere Dateien in den gleichen Zielnamen umbenannt werden. Da bleibt am Ende dann ja nur eine übrig.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Bedeutet das, dass ich mein Gerüst nicht gebrauchen kann und dies neu mit iglob aufbauen soll? :o
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja. Wie es besser geht, hab ich Dir doch schon gezeigt.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Das hast Du, das stimmt.

In der Zwischenzeit habe ich - so glaube ich zumindest - auch herausgefunden was Du mit "Du mußt schon den absoluten Pfad angeben." gemeint hast. In erwähntem Ordner befinden sich unzählige (ein bisschen übertrieben aber es sind sehr viele) Dateien. Von der Synthax her sind diese jetzt gleich gegliedert was gut ist. Bei name.replace() müsste ich jetzt den gesamten Pfad erfassen. Wenn ich also z.B. folgende Dateien im Ordner habe:

20200507-Color_red-15289
20200509-Color_red-15289
20200510-True_pink-15289
20200515-Color_red-15289

Kann ich den Pfad dann wie folgt erfassen?: name.replace(r'P:/KA Hauptordner/Empfang/Ordner Bebbi/Bestellungen/*_Color_red_*_*_*.pdf',r'P:/KA Hauptordner/Empfang/Ordner Bebbi/Farbe_rot/*_Kontoauszug_*_*_*.pdf')

Es sollen ja nur diejenigen Dateien mit Color_red umgeschrieben werden und der Rest soll gleich bleiben.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Nein, soetwas geht nicht mit replace. Was geht, hab ich Dir doch schon gezeigt. Dass das absolute Pfade sind, ist bei pathlib fast egal, weil man mit den entsprechenden Methoden nur den Dateinamen verarbeitet; oder falls Du auch den Pfad ändern willst, das per parents, oder / ".." / oder ähnlichem machen kannst:

Code: Alles auswählen

from pathlib import Path

BESTELL_PATH = Path('P:/KA Hauptordner/Empfang/Ordner Bebbi/Bestellungen')
for filename in BESTELL_PATH.glob("*_Color_red_*.pdf"):
    date, name, num, can1, can2 = filename.stem.split('_')
    name = name.replace('red', 'rot')
    new_name = '{}_{}_{}{}'.format(date, name, num, filename.suffix)
    new_path = filename.parents[1] / "Farbe_rot" / new_name
    filename.rename(new_name)
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Danke Siruis3

Was ich jetzt einfach nicht verstehe. Wenn ich Deinen Code im Print anschaue, dann wird das Resultat genau so angezeigt wie gewünscht. Möchte ich es allerdings ausführen lassen kommt folgende Meldung:

file.rename(new_name)
NameError: name 'file' is not defined
>>>

Weshalb denn das und weshalb gibt es keine Meldung beim Print()?
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du denn genau ausgeführt?
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich habe Deinen Code kopiert (wie ich lernen musste, macht Abschreiben ja keinen Sinn).

wenn ich am Schluss des Code print(rename(new_name)) wird das Ergebnis wie gewünscht angezeigt. Behalte ich Deinen Code 1 zu 1 bei, dann sollte er doch die Dateien umschreiben.....oder nicht? Dann folgt hingegen die Fehlermeldung...
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Da aber die Variable `file` in meinem gesamten Code nicht vorkommt, dann kann das auch nicht der Code sein, den Du ausgeführt hast. 1:1 stimmt also nicht. Daher ja meine Frage, was Du exakt und genau getan hast?
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ja, stimmt. Zum verzweifeln. Du hast natürlich 'filename' geschrieben. Ich war lange der Meinung, dass der Lerneffekt grösser ist wenn man die Codes abschreibt, das macht aber - zumindest bei mir - definitiv keinen Sinn. Mit 'filename' erscheint jetzt folgende Meldung:

Traceback (most recent call last):
File "C:\Users\SM\AppData\Local\Programs\Python\Python38-32\rename_test_1.py", line 9, in <module>
filename.rename(new_name)
File "C:\Users\SM\AppData\Local\Programs\Python\Python38-32\lib\pathlib.py", line 1340, in rename
self._accessor.rename(self, target)
OSError: [WinError 17] Das System kann die Datei nicht auf ein anderes Laufwerk verschieben: 'P:\\KA Hauptordner\\Empfang\\Ordner Bebbi\\Bestellungen\\20200430_Color_red_1622244-001_6396015_000000.pdf' -> '20200430_Farbe_rot_1622244-001.pdf'

Es muss ja nichts auf ein anderes Laufwerk kopiert werden. Die Datei kann im bestehenden Ordner "überschrieben" werden.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Das mit dem Abschreiben und Verstehen ist schon richtig. Das Verstehen ist aber wichtiger. Dann fallen einem auch die Fehler auf, die man selbst, oder andere machen - zum Beispiel ich.
Wenn man den Code verstanden hat, indem man z.B. einzelne Zeilen im Interaktiven Interpreter ausführt und schaut, was passiert und was die einzelnen Methoden an Rückgabewerten haben, dann erkennt man relativ leicht, was denn nicht ganz stimmt.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich muss das Ganze definitiv noch einmal durchgehen wenn es läuft. Was ich nicht begreiffe ist, dass er bei print(), die gewünschten Ergebnisse bringt, dies dann aber nicht umsetzen kann
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt exakter lesen. Der Computer ist jedenfalls sehr gut darin, nur exakt das zu tun, was man ihm sagt und nicht, das was man meint.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Das Problem ist, dass ich die Fehlermeldung nicht richtig interpretieren kann. Meiner Meinung nach muss die Datei ja nicht verschoben werden, weshalb dann der Hinweis, dass dies nicht gemacht werden kann. Ich habe versucht beim Code die Zeile mit new_path zu entfernen, was mich aber auch nicht weiterbring.
Benutzeravatar
__blackjack__
User
Beiträge: 13103
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bebbi: Laut Fehlermeldung wird versucht die Datei "P:\\KA Hauptordner\\Empfang\\Ordner Bebbi\\Bestellungen\\20200430_Color_red_1622244-001_6396015_000000.pdf" nach "20200430_Farbe_rot_1622244-001.pdf" zu verschieben. Da sollte auffallen das bei der Quelle ein langer Pfad vor dem Dateinamen steht und beim Ziel nur ein Dateiname ohne Pfad. Für das Ziel wird also das aktuelle Arbeitsverzeichnis des Prozesses angenommen. Und das aktuelle Arbeitsverzeichnis scheint nicht auf Laufwerk "P:" zu liegen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

@_blackjack_ danke, jetzt habe ich es verstanden. Macht ja eigentlich auch Sinn, dass ich genau hinschreiben muss, wo die neue Datei abgelegt werden soll. Ich dacht ursprünglich, dass sich diese Frage nicht stellt, da ja keine neue Datei erstellt sondern lediglich eine bestehende an bestehendem Ort überschrieben wird.

Ich gehe davon aus, dass die Ergänzung des Pfades bei new_path eingefügt werden muss. Falls das stimmt mache ich einmal weiter nach dem trie and error Prinzip :-)
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

ES FUNKTIONIERT !!!!

DANKE
Antworten