Ä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

Schau Dir nochmal in einem Tutorial Deiner Wahl an, wie man for-Schleifen schreibt.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Die Synthax sollte doch sein:

for variable in Sequenz:
Anweisung 1
else:
Else Anweisung

Auf meinen Code müsste das dann doch irgendwie so aussehen...was natürlich total falsch ist

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


das Ganze Python ist so umfangreich man weiss überhaupt nicht wo man beginnen soll. Zu Beginn steht man immer an der Wand, liegt aber wohl an mir.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

fang am besten ganz einfach an: Wie gibt man mit einer for-Schleife die Zahlen von 1 bis 10 aus?
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Zuerst muss ich die Liste definieren z.B.

x = [1,2,3,4,5,6,7,8,9,10]

dann kann ich mit folgendem Befehl die Werte abrufen:

for y in x:
print(y)

dann sollte ich die Werte von x erhalten. Mit range() könnte ich die Ausgabe eingrenzen.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Mit range begrenzt man nichts, sondern generiert etwas. Nämlich Sequenzen von Zahlen.

Schau mal in die Dokumentation.

Damit kannst du dir das Binden einer per Hand geschriebenen Liste an x sparen. Es reicht, wenn du mit der for-Schleife über das läufst, was range dir liefert.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Und wenn Du dann den Variablen noch gute Namen gegeben hast, kannst Du als nächsten Schritt Dir die gewünschten Dateinamen erzeugen und auch einfach mal per print ausgeben lassen.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

@sparrow, stimmt da habe ich mich falsch ausgedrückt.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

In meinem Fall würde ich ja auf die Namen der Dateien im entsprechenden Ordner beziehen und dann dem Programm mitteilen, dass wenn der neu zu erstellende Namen bereits vorhanden ist dieser mit einer fortlaufenden Zahl zu ergänzen ist.

ich könnte also for filename in BESTELL_Path['P:/KA Hauptordner/Empfang/Ordner Bebbi/Bestellungen/{}_{}_{}{}'] ergänzen....?!?! Damit würde er unter diesem Pfad suchen ob der Name bereits existiert, falls nein kann der Name wie oben beschrieben gespeichert werden falls nein folgt ursprünglicher Name +1. Macht das Sinn?

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 = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/Bestellungen/{}_{}_{}{}'.format(date, name, num, filename.suffix)
    new_path = filename.parents[1] / "Farbe_rot" / new_name
for filename in BESTELL_PATH ['P:/KA Hauptordner/Empfang/Ordner Bebbi/Bestellungen/{}_{}_{}{}']
    filename.rename(new_name)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@Beppi: warum versuchst Du nun wieder drei Schritte auf einmal zu machen? Und Syntax raten ist selten ein guter Weg, um ein funktionierendes Programm zu schreiben.

Wie würdest Du mit Hilfe einer for-Schleife Dateinamen erzeugen, die eine fortlaufende Nummer enthalten?
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

@Sirius3, ich weiss, das ist leider mein Problem.

Also ich habe jetzt einen String erstellt mit Namen, was der gesuchten Lösung wohl näher kommt. Danach habe ich versucht diesen Namen eine Nummer zuzuführen. Das Ganze sieht so aus, bringt aber noch nicht die gewünschte Lösung.

Code: Alles auswählen

name = ('rot','grün','gelb','blau')
i = 1
y = (i+1)

new_name = [name]+[y]

print(new_name)

Das Ergebnis ist wie folgt 
[('rot', 'grün', 'gelb', 'blau'), 2]
>>>
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Irgendwie verzettelst du dich und rätst dann Code und Syntax.
So wird das nicht funktionieren.

Code: Alles auswählen

name = ('rot','grün','gelb','blau') # Ein Tuple mit Elementen wird erstellt
i = 1                               # Der Wert 1 wird an i gebunden
y = (i+1)                           # Der Wert 2 wird an y gebunden

new_name = [name]+[y]               # Es wir der Tuple 'name' und der Wert 2 in eine Liste gepackt und an new_name gebunden.
Und wie genau soll dir das helfen?
Ich kann daraus noch nicht einmal ableiten, was du überhaupt vor hattest und wie das zu deinem vorherigen Problem passt.

Sirius3 hat es doch bereits gesagt: Löse das große Problem indem du es in Teilprobleme unterteilst und diese Teilprobleme löst.
Er hat dir sogar gesagt, welches der sinnvollste nächste Schritt wäre.
Nur machst du etwas ganz anderes. Wie genau sollen wir dann helfen?
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

also ich habe mit folgendem String begonnen

x = [1,2,3,4,5,6,7,8,9,10]

Danach sollte ich den Variablen gute Namen geben. Ich habe mich für die Farben entschieden, ob das gut ist naja.

x = ['rot','grün','gelb','blau']

mit print(x) kommen dann die entsprechenden Werte. Jetzt müsste ich doch aber irgendwie die Zahl dazu bekommen und dies sogar aufsteigend....
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich verstehe jetzt gar nicht mehr, was Du da eigentlich machst. Darum versuch ich das, was ich verstanden habe, mal aufzuschreiben.
Du hast einen Dateinamen:

Code: Alles auswählen

new_name = '{}_{}_{}{}'.format(date, name, num, filename.suffix)
Der soll jetzt noch mit einer laufenden Nummer erweitert werden:

Code: Alles auswählen

new_name = '{}_{}_{}_{}{}'.format(date, name, num, index, filename.suffix)
Nächster Schritt wäre, diesen `index` mit einer for-Schleife hochzählen zu lassen, jeweils einen new_name erzeugen und versuchen, die Datei in diesen Namen umzubenennen, wenn das klappt, kann man die for-Schleife abbrechen.

Für Dich hängt es aber noch am ersten Schritt: jeweils einen new_name mit Index erzeugen.
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

@Beppi: Das ist kein String sondern eine Liste, die an den Namen "x" gebunden wird.
Und die Variablen sind nicht in der Liste, sondern das, woran du etwas bindest. Also das "x". Und "x" ist ein schlechter Name, weil niemand weiß, was "x" ist.

Aber wie ich dir schon einmal schrieb: Du brauchst keine Liste von Zahlen. Dafür gibt es range.

Code: Alles auswählen

for number in range(1, 11):
    print(number)
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

@Sirius3, genau das wäre das Ziel. Der new_name wird mit einem weiteren Teil ergänzt { } welcher die aufsteigende Zahl beinhalten soll sofern der neu zu erstellende Name bereits existiert.

Die Generierung der Nummer läuft über eine for-Schlaufe, so habe ich das jedenfalls verstanden. Wenn ich nach for Schlaufen google kommen unzählige Beiträge aber ich finde nur range. Von ranges spricht ja auch Sparrow, aber weshalb muss ich ein Range definieren? Ich weiss ja nicht wie viele Dateien den gleichen Namen haben würden. Es könnten ja theoretisch 100 sein. Dann wäre der Range vielleicht zu klein. Ich begreife das nicht.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Ja, aber `range` wäre schonmal ein Anfang. Besser ist natürlich itertools.count, aber das wäre schon Fortgeschrittenenlevel.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Also dann habe ich untenstehenden Befehl, mit der zusätzlichen {} welcher als Platzhalter für den Index dient.

new_name = '{}_{}_{}_{}{}'.format(date, name, num, index, filename.suffix)

mit einer range z.B. (1, 11) gebe ich dem System die Information, dass der Index sich auf dieses Range beziehen soll. Dies könnte irgendwie so aussehen, oder?.

index = range(1, 11)
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Wo ist denn da jetzt die Schleife?
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

da habe ich eines meiner Probleme. Ich habe jetzt dem System gesagt, dass die Werte für Index aus dem range(1, 11) kommen sollen. Irgendwie muss ich ja definieren, dass wenn der Name vorhanden ist der Index generiert werden muss und sonst nicht. Entsprechend habe ich folgendes:

Bedingung: Name bereits vorhanden
wenn Ja: Ergänzen mit dem Index
wenn Nein: new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}_{}{}'.format(date, name, num, index, filename.suffix), ohne Angabe des Index

Wie ich aber dies in eine Formel verpacke....
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich hab wieder versucht etwas einzubauen, wohl wieder zu viel.... Das sieht jetzt wie folgt aus:

Code: Alles auswählen

from pathlib import Path

BESTELL_PATH = Path('P:/KA Hauptordner/Empfang/Ordner Bebbi')
for filename in BESTELL_PATH.glob("*_color_red_*.pdf"):
    date, name, num, can1, can2, can3 = filename.stem.split('_')
    name = name.replace('red', 'rot')
    for index in range(1, 11):
        new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}_{}{}'.format(date, name, num, index, filename.suffix)
        new_path = filename.parents[1] / "Farbe_rot" / new_name
        filename.rename(new_name)
[code end]

Das ist natürlich noch nicht richtig, da er mir nun folgende Meldung bringt:

Traceback (most recent call last):
  File "C:\Users\SM\AppData\Local\Programs\Python\Python38-32\Python Test 2.py", line 10, 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)
FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden: 'P:\\KA Hauptordner\\Empfang\\Ordner Bebbi\\20200507_Color_red_15289_1_1.pdf' -> 'P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Color_red_2.pdf'
>>> 

momentan habe ich den Überblick sowieso verloren.
Antworten