Ä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: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast jetzt eine for-Schleife, die Namen generiert.
Jetzt fehlt natürlich noch die Abfrage, ob das Umbenennen funktioniert hat. Denn jetzt nennst Du die Datei in ..._1 um, und dann die selbe Datei (die natürlich jetzt nicht mehr existiert) in ..._2.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich verstehe das mit den Schleifen immer noch nicht.

Die Schleife hat zwei mögliche Resultate. Entweder wahr oder falsch.

Zu Beginn des Programmes lasse ich die Dateien umschreiben. Dann kommt die for Schleife ins Spiel. Wenn also der neue Name nicht vorhanden ist, so braucht es keine weitere Modifikation (Variante wahr). Sollte der Name bereits existieren (Variante falsch) so soll der Name mit einer Zahl ergänzt werden.

Ich habe aber keine Ahnung wie ich dies Aussage in eine Formel verpacken soll. Die Beispiele die ich auf Deutsch in Netz finde sind jeweils mit Zahlen. Z.B. steht da:

for x in range (3, 7):
print (x)

mit dem Resultat #3 #4 #5 #6

Das macht ja alles Sinn, aber wie breche ich das auf mein Problem runter???

Ich habe dem bestehenden Namen mit {} einen weiteren Wert zugeordnet, namens Index. Dieser soll aus dem Range(1, 11): generiert werden, falls es das benötigt. Wie soll ich hier eine Abfrage erstellen welche prüft of das funktioniert hat?
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Du kennst bereits alle Bestandteile, mußt sie nur noch richtig zusammensetzen.
In einer Schleife, versuchen umzubennenen, wenn es klappt, Schleife abbrechen sonst mit der nächsten Zahl weiter machen.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

und hier hört meine Vorstellungskraft auf. Ich weiss nicht wohin, in welcher Synthax die einzelnen Bestandteile kommen.

irgendwo müsste ich doch eine Art wenn dann - Anweisung haben. wenn der Name bereits existiert dann bestehender Name + Index. Eine For-Schleife ist ja etwas anderes als if und ifelse oder nicht?
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bebbi: Ja eine ``for``-Schleife ist was anderes als ``if``/``else``. Die Schleife generiert die Zahlen. Schleifen müssen aber nicht komplett durchlaufen, die kann man auch abbrechen. Ob der Name bereits existiert kann man prüfen. Sollte man vielleicht auch wenn das Crossplattform funktionieren soll, denn die Ausnahme da die Datei bereits existiert kommt nicht auf jeder Plattform.

Und ich persönlich würde deutlich mehr mit Funktionen arbeiten. Zum Beispiel hier eine Funktion die umbenennt und ggf. eine Zahl anhängt, falls das Ziel bereits existiert. In dieser Funktion sollte auch nur *das* gemacht werden. Die muss also überhaupt nichts davon wissen wie und warum man vorher die beiden Pfade, Quelle und Ziel, mal erstellt hat.
„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

Danke für Deine Antwort. Ich weiss, dass Schleifen gestoppt werden können. Aber wie gesagt, ich habe so etwas noch nie umgesetzt und bin nicht in der Lage dies mit den Angaben die ich habe das zu machen... Ich muss irgend einen anderen Weg finden.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich habe wieder etwas verschlimmbessert. Die Dateien werden zwar in der richtigen Reihenfolge umgeschrieben aber der Name wird nicht vom englischen ins deutsche verändert und es wird immer die Nummer 1 ergänzt. Das sollte ja nicht so sein :oops: :oops: :oops:

Code: Alles auswählen

from pathlib import Path

BESTELL_PATH = Path('P:/KA Hauptordner/Empfang/Ordner Bebbi') # Pfad des Ordners
for filename in BESTELL_PATH.glob("*_color_red_*.pdf"): # for Schleife 
    date, name, num, can1, can2, can3 = filename.stem.split('_') # Aufsplittung des Namens in 6 Teile
    name = name.replace('red', 'rot') # Replace von red durch rot
    new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}_{}'.format(date, name, num, filename.suffix) # Pfad und Zusammensetzung des neuen Namens 
    for index in range(1, 20):  # Möglicher Indexwert
        new_name = 'P:/KAHauptordner/Empfang/Ordner Bebbi/{}_{}_{}_{}{}'.format(date, name, num, index, filename.suffix) # Ergänzung des Namens mit dem Indexwert
        break   # For Schleife abbrechen, da Index ergänzt wurde und keine Datei gleich benannt ist
    new_path = filename.parents[1] / "Farbe_rot" / new_name 
    print(new_name)
[code]

Die Dateien werden wie folgt umgeschrieben:

P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Color_red_1.pdf
P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Color_red_1.pdf
P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Color_red_1.pdf
P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Color_red_1.pdf
P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Color_red_1.pdf

Die Idee wäre ja folgendes:

P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Farbe_rot_1.pdf
P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Farbe_rot_2.pdf
P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Farbe_rot_3.pdf
P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Farbe_rot_4.pdf
P:/KA Hauptordner/Empfang/Ordner Bebbi/20200507_Farbe_rot_5.pdf

regt Euch bitte nicht auf.....
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Programme machen immer genau das, was man schreibt. Die erste Zuweisung an `new_name` wird nicht benutzt. Eine for-Schleife, die immer beim ersten Durchlaufen per break verlassen wird, ist keine sinnvolle for-Schleife. Warum sollte da jemals was anderes als 1 rauskommen?
`new_name` sollte wirklich immer nur den Dateinamen enthalten, weil Du den Pfad ja später zusammensetzt.
Wenn ich das richtig sehe (und das hättest Du selbst auch einfach dadurch herausfinden können, dass Du date name und num einfach mal ausgibst), enthält `name` nicht "red" kann also auch nicht durch replace ersetzt werden.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ok das mit dem Replace macht Sinn, habe ich so verstanden.

Mit der ersten Zuweisung new_name meinst Du 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}_{}'.format(date, name, num, filename.suffix)

wenn ich bei new_name den Pfad weglasse verbleibt:

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

dann müsste ich doch mit einer For-Schlaufe die Bedinungen sagen, dass wenn der Name bereits existiert er den Index anhangen soll. Irgendwie so:

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

was ich nicht begreiffe, ist, ich müsste doch zwei For Schleifen haben, einmal wie oben um herauszufinden ob in diesem Pfad der Name bereits existiert und einmal eine um den Index zu generieren....?!?!?
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Du brauchst nur eine Schleife, in der Du sowohl den Namen erzeugst, als auch prüfst, ob die Datei existiert.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

und wie ist dafür die Syntax und wo muss das stehen? Ich kann doch auch kein Schiff zeichnen wenn ich nicht weiss wie eines aussieht. Im Netz finde ich zwar wie eine for Schleife auszusehen hat, ich kann das aber auf meine Situation mit Text nicht ummünzen.

Meiner Meinung muss das Programm bis Linie 7 so sein. Danach muss geprüft werden ob der Name bereits existiert. Wie muss ich das darstellen?
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Du weißt, wie eine for-Schleife aussieht und Du weißt, wie man prüft, ob eine Datei existiert. Wenn Du also weißt, wie ein Schiff aussieht und weißt, wie ein Windrad aussieht, kannst Du auch ein Schiff mit Windrad zeichnen.
Bild
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Immer gut wenn andere wissen, was man weiss...

Die for Schleife wird wie folgt definiert:

for Variable in Sequenz:
Anweisung1
Anweisung2
...
Anweisung
else:
Else-Anweisung1
Else-Anweisung2
...
Else-Anweisung

bei mir also irgendwie (und hier fängt das raten an....)

for new_name in BESTELL-PATH
new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}_{}
else
new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}_{}{}


Die Antwort wird jetzt wohl sein, dass dies zwar falsch ist, ich aber alle Bestandteile kenne und ja weiss wie eine for Schlaufe aussieht. Danke. Leider habe ich weder einen Dozenten noch sonst jemand zum nachfragen. Ich bin einfach zu dumm, um die Angaben im Netz auf mein Problem umzuwandeln.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das for-schleifen eine else-Klausel haben ist richtig, die ist aber fuer deinen Anwendungsfall komplett irrelevant. Es ist ein eher obskures Feature von Python, lass dich davon nicht vewirren. Und du bist jetzt schon ein bisschen dabei, dass man hier code-tags verwenden muss, sollte inzwischen klar sein.

Code: Alles auswählen

for new_name in BESTEL_PATH: # sieht nach Konstante aus. 
     if ...:
        ...
     else:
        ...
Sirius3
User
Beiträge: 18266
Registriert: Sonntag 21. Oktober 2012, 17:20

Ich weiß echt nicht, wie man Dir helfen soll, wenn Du anscheinend in Schritt vor gehst und dann wieder 5 zurück.
Du hattest doch schon:

Code: Alles auswählen

    for index in range(1, 20):  # Möglicher Indexwert
        new_name = 'P:/KAHauptordner/Empfang/Ordner Bebbi/{}_{}_{}_{}{}'.format(date, name, num, index, filename.suffix) # Ergänzung des Namens mit dem Indexwert
HIER fehlt noch die Prüfung ob es die Datei gibt, und falls nein, die Schleife abzubrechen.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich weiss, dass es zum verzweifeln ist, das ist es für mich auch. Mein Korpus hat eine andere Form als heute Morgen...

Sorry aber jetzt habe ich wieder zwei unterschiedliche for Schlaufen. Ich habe versucht beides irgendwie in eine Form zu bringen (natürlich mit raten woher soll ich die Form sonst wissen? :?: ).

Option 1:

Code: Alles auswählen

from pathlib import Path

BESTELL_PATH = Path('P:/KA Hauptordner/Empfang/Ordner Bebbi') # Pfad des Ordners
for filename in BESTELL_PATH.glob("*_color red_*.pdf"): # for Schleife 
    date, name, num, can1, can2, can3 = filename.stem.split('_') # Aufsplittung des Namens in 6 Teile 
    name = name.replace('_color red_', '_Farbe rot_') # Replace von red durch rot
    new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}'.format(date, name, num, filename.suffix) # Pfad und Zusammensetzung des neuen Namens 
    for index in range(0, 20):
        if new_name ('{}_{}_{}{}' == '{}_{}_{}{}'):
            new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}{}'.format(date, name, num, index, filename.suffix)
        else:
            new_name = '{}_{}_{}'
        break
    new_path = filename.parents[1] / 'Farbe_rot' / new_name
    print(new_name)
   
   
  Hier erscheint folgende Fehlermeldung:
  
  Traceback (most recent call last):
  File "C:\Users\SM\AppData\Local\Programs\Python\Python38-32\Python Test 2.py", line 9, in <module>
    if new_name ('{}_{}_{}{}' == '{}_{}_{}{}'):
TypeError: 'str' object is not callable
>>> 


Option 2:

[code]
from pathlib import Path

BESTELL_PATH = Path('P:/KA/Empfang/Ordner Bebbi') # Pfad des Ordners
for filename in BESTELL_PATH.glob("*_color red_*.pdf"): # for Schleife 
    date, name, num, can1, can2, can3 = filename.stem.split('_') # Aufsplittung des Namens in 6 Teile 
    name = name.replace('_color red_', '_Farbe rot_') # Replace von red durch rot
    new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}'.format(date, name, num, filename.suffix) # Pfad und Zusammensetzung des neuen Namens 
    for index in range(0, 20):
       new_name = 'P:/KA/Empfang/Ordner Bebbi/{}_{}_{}{}'.format(date, name, num, index, filename.suffix)
    else:
            new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}'
    break
    new_path = filename.parents[1] / 'Farbe_rot' / new_name
    print(new_name)
    
    Hier passiert überhaupt nichts  :cry: 
    
    Ich weiss, dass ihr das nicht nachvollziehen könnt!
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

Bebbi hat geschrieben: Donnerstag 28. Mai 2020, 12:51 [...] woher soll ich die Form sonst wissen? :?: ).
Durch ausprobieren, beobachten und lernen. Ein Grundlagentutorial kann da auch hilfreich sein.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Ich probiere seit mehreren Tagen aus und versuche das Ganze zu verstehen...
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Weshalb kann mir z.B. nicht jemand sagen der Befehl in Zeile X ist falsch und sollte so aussehen. Dann kann ich das einfügen, schauen ob es funktioniert und entsprechend versuchen nachzuvollziehen. Wenn wüsste ich auch ob das Windrad beim Fisch hinten oder vorne stehen muss. So wie jetzt verzettle ich mich total und habe keine Ahnung mehr was überhaupt wie aussehen soll. Ich habe schon gefühlte 100 Varianten versucht und keine scheint Sinn zu machen. Dann kommen immer die Aussagen du hast ja alles und weisst wie es aussehen sollte. Wer sagt denn das ich das weiss. Vielleicht steht das ja irgendwo aber ich sehe es nicht.....

Mein letzter Versuch war das hier - klappt natürlich nicht. Ich weiss, dass jeder von Euch den Fehler sofort sieht, ich kanns leider nicht sehen.

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('_color red_', '_Farbe rot_')
    for index in range(1, 20):
        new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}{}'.format(date, name, num, filename.suffix)
    else:
        new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}{}{}'.format(date, name, num, index, filename.suffix)
    break
    new_path = filename.parents[1] / "Farbe_rot" / new_name
    print(new_name)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das else nach dem for ist NIEMALS richtig in deinem Code. Wenn du etwas mehrfach machen willst, nimmst du eine Schleife. Wenn du etwas bedingt tun willst, nimmst du eine if-Anweisung. Wenn du etwas bedingt mehrfach tun willst, packst du die Anweisung *in* die Schleife. Wenn du etwas pruefen willst, und DANN gegebenenfalls etwas mehrfach tun, dann kommt die for-Schleife IN die if-Anweisung.

Das break ist auch falsch, oder sollen die Zeilen danach wirklich niemals ausgefuehrt werden? Dann koennen sie auch weg.

Ich rate mal, was du willst;

Code: Alles auswählen


        new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}{}'.format(date, name, num, filename.suffix)
        if os.path.exists(new_name):
              for i in itertools.count():     
                       new_name = 'P:/KA Hauptordner/Empfang/Ordner Bebbi/{}_{}_{}{}{}'.format(date, name, num, index, filename.suffix)
                       if not os.path.exists(new_name):
                              break
         # ab hier ist new_name dann eindeutig
Antworten