Spezielle Daten verschieben

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.
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bebbi: Was ist denn daran jetzt überraschend und/oder unklar? Du versuchst den ``/``-Operator auf zwei Zeichenketten anzuwenden. Was sollte denn da heraus kommen und warum? Beispiel:

Code: Alles auswählen

In [1]: "a text" / "another text"                                               
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-1-63a7b50d883a> in <module>
----> 1 "a text" / "another text"

TypeError: unsupported operand type(s) for /: 'str' and 'str'
Was hätte denn da anderes als die Ausnahme als Ergebnis kommen sollen und warum?
„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

Habe den Code jetzt wie folgt angepasst.

Code: Alles auswählen

def main():
    for name, customer_number in FILTERS:
        destination = DESTINATION_PATH / name
        for sourcefile in SOURCE_PATH.glob(f"*{customer_number}*.docx"):
            sourcefile.rename("C:/Users/Startklar/Desktop/Empfangsordner" and name)

if __name__ == "__main__":
   main()
Komischerweise hat es beim ersten Versuch halbwegs funktioniert. Eine Datei wurde in den Ordner "Sven" verschoben, aber auch gleich in Sven umbenannt. Das soll er aber nicht machen, der Dateiname darf nicht veraendert werden. Die andere Datei, welche in den Ordner Gerald hätte müssen ist verschwunden.... Beim zweiten Versuch kommt wieder eine Fehlermeldung:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\Startklar\Desktop\Move_II.py", line 20, in <module>
    main()
  File "C:\Users\Startklar\Desktop\Move_II.py", line 17, in main
    sourcefile.rename("C:/Users/Startklar/Desktop/Empfangsordner" and name)
  File "C:\Users\Startklar\AppData\Local\Programs\Python\Python38\lib\pathlib.py", line 1358, in rename
    self._accessor.rename(self, target)
FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'C:\\Users\\Startklar\\Desktop\\Ausgangsordner\\Sdi233004087109aiDIKD.docx' -> 'Sven'
>>> 
Es gibt wohl Sachen die werde ich nie begreifen...
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bebbi: Jetzt fängst Du an Syntax zu raten. Was soll denn das ``and``? Der Rechner versteht keine natürliche Sprache und macht dann was er denkt was Du gemeint haben könntest. Das hat alles eine feste Bedeutung und ``"C:/Users/Startklar/Desktop/Empfangsordner" and name`` ist immer das gleiche wie einfach nur ``name`` denn `name` ist immer ”wahr” weil das nie die leere Zeichenkette ist, womit ``and`` immer den zweiten Operanden als Ergebnis hat.
„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

Sorry aber ich stehe total auf dem Schlauch und beginne, wie Du schreibst an der Synthax zu wursteln. Du hast mir zuvor mitgeteilt, dass der gesamte Pfad in den Code muss. Dies habe ich gemacht:

Code: Alles auswählen

def main():
    for name, customer_number in FILTERS:
        destination = DESTINATION_PATH / name
        for sourcefile in SOURCE_PATH.glob(f"*{customer_number}*.docx"):
            sourcefile.rename("C:/Users/Startklar/Desktop/Empfangsordner/")
Mit diesem Code kommt mir aber der Fehler, dass die Datei bereits existiert. Das stimmt aber nicht, da im Empfangsordner keine solche Datei liegt sondern nur im Ausgangsordner. Ich verstehe nicht, weshalb diese Meldung kommt und ich verstehe nicht wie ich dem System mitteilen soll, dass der Name nicht geändert sondern lediglich in den erwähnten Ordner unter erwähntem Pfad verschoben werden soll.

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\Startklar\Desktop\Move_II.py", line 20, in <module>
    main()
  File "C:\Users\Startklar\Desktop\Move_II.py", line 17, in main
    sourcefile.rename("C:/Users/Startklar/Desktop/Empfangsordner/")
  File "C:\Users\Startklar\AppData\Local\Programs\Python\Python38\lib\pathlib.py", line 1358, in rename
    self._accessor.rename(self, target)
FileExistsError: [WinError 183] Cannot create a file when that file already exists: 'C:\\Users\\Startklar\\Desktop\\Ausgangsordner\\jaösdfi10408710adsjfia5.docx' -> 'C:/Users/Startklar/Desktop/Empfangsordner/'
>>> 
Ich drehe mich im Kreis, weiss aber wirlich nicht, was ich noch ausprobieren soll. Der Fehler muss doch bei diesem sourcefile.rename() liegen.....
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bebbi: Doch das stimmt denn sonst würdest Du die Fehlermeldung nicht bekommen. Die ”Datei” »C:/Users/Startklar/Desktop/Empfangsordner« existiert bereits. Du versuchst da eine Datei zu einem existierenden Verzeichnisnamen umzubennenen. Das was Du da angibst/angeben musst ist der *volle Name* nach dem umbenennen. Und die Datei soll am Ende nicht im Verzeichnis »C:/Users/Startklar/Desktop« liegen und »Empfangsordner« heissen. Genau das sagst Du da aber. Und das geht nicht weil es im Verzeichnis »C:/Users/Startklar/Desktop« bereits eine ”Datei” mit dem Namen »Empfangsordner« gibt. Das ist das Verzeichnis was dort existiert und deshalb kommt die Ausnahme.

Da die Datei wahrscheinlich nicht umbenannt werden soll, müsste mindestens der alte Dateiname da noch mal auftauchen, plus wohl noch ein kundenspezifischer Teilpfad, denn sonst landet das vom Eingangsordner einfach auf der gleichen Ebene im Empfangsordner. Und ``/`` als Operator funktioniert nicht auf Zeichenketten sondern auf `Path`-Objekten. Und Du hast da doch sogar so etwas was schon fast fertig ist, aber nicht verwendet wird. Da fehlt halt noch etwas weil das ja auch ein *Verzeichnisname* ist und kein *Dateiname* den es noch nicht gibt.
„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

Danke _blackjack_ aber ich gebs jetzt auf.

Ich weiss was Du meinst, aber wie das umzusetzen ist kann ich nicht nachvollziehen. Ich habe den Überblick verloren und bin nur noch am raten. Sorry für die Zeitverschwendung.
Sirius3
User
Beiträge: 17761
Registriert: Sonntag 21. Oktober 2012, 17:20

Du hast einen `sourcefilename` und ein `destination` Verzeichnis. Das einzige, was Du tun mußt, ist den Dateinamen an destination anzuhängen, und den Namen bekommst Du, über das `name`-Attribut von `sourcefilename.
Also

Code: Alles auswählen

sourcefilename.rename(destination / sourcefilename.name)
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

Danke Sirius3, ich rege mich auf, dass ich nicht auf solche Lösungen komme. Das Ganze ist mir einfach noch zu fremd....
Antworten