Ä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: 18265
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: 18265
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: 18265
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: 18265
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: 18265
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: 18265
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: 14030
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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
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
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Hallo zusammen

Soeben habe ich bemerkt, dass das Programm noch nicht ganz optimal läuft. Es hat sich ergeben, dass durch das gewünschte Umschreiben nun mehrere Dateien den gleichen Namen haben würden, was entsprechend zu einer Fehlermeldung führt. Das System teilt mit, dass die Umwandlung nicht stattfinden kann, da dieser Name bereits existiert. Ich würde nun gerne den Code so ergänzen, dass bei Dateien mit gleichem Namen am Schluss eine fortlaufende Zahl z.B. 1 ergänzt wird.

Wie muss ich hier vorgehen?

Danke
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Ich würde die Fehlermeldung mit einem try/except Abfangen und dann im except die Ausnahme dementsprechend definieren.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

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)
[code]

Das heisst ich könnte nach new_path folgendes einfügen:

[code]
filename.rename(new_name)
except:
filename.rename(new_name)+(i+1)
[code]

Ich nehme an, dass ich mit einem Parameter wie i arbeiten muss. Wo muss ich allerdings i=i oder so einfügen....?
Sirius3
User
Beiträge: 18265
Registriert: Sonntag 21. Oktober 2012, 17:20

Für except braucht man auch einen try-Block und die Exception, die man abfangen möchte, die steht ja in der Fehlermeldung, die Du bekommst. Wie man einen Dateinamen aus mehreren Teilen zusammensetzt, weißt du schon. Dass einfach eine Zahl auf den Rückgabewert von rename zu addieren nicht richtig sein kann, ... statt zu raten nimm das was Du schon kennst und modifizierte es. Für i brauchst Du noch eine Schleife, den die Datei mit der 1 könnte ja auch schon existieren.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Habe wieder einmal etwas versucht zu verbessern. Jetzt stehe ich aber mit der Schleife für i im Niemandsland

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')
    while(i==1):
        try: new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/Bestellungen/{}_{}_{}{}'.format(date, name, num, filename.suffix)
        except: new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/Bestellungen/{}_{}_{}{}{i+1}'.format(date, name, num, filename.suffix)
    while(i+1):
        new_path = filename.parents[1] / "Farbe_rot" / new_name
        filename.rename(new_name)



Auf obigen Code kommt folgende Fehlermeldung:

Traceback (most recent call last):
  File "C:/Users/SM/AppData/Local/Programs/Python/Python38-32/Python Test 2.py", line 7, in <module>
    while(i==1):
NameError: name 'i' is not defined
>>> 


Ich denke es hat im Code noch einige Fehler. Ohne die Schleife komme ich aber nicht weiter.
Antworten