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: 13107
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bebbi: Was ist denn Deiner Meinung nach der Unterschied zwischen umbenennen und verschieben (solange man auf dem gleichen Dateisystem bleibt)?
„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

Verstehe, habe jetzt herausgefunden, dass dies scheinbar das gleiche ist. Für mich war umbenennen bisher der Datei einen neuen Namen geben und verschieben etwas von A nach B zu bringen...

Bei sourcefile.rename() muss ich doch innerhalb der Klammer angeben von wo, nach wo die Datei verschoben werden soll oder etwa nicht? Ich meinem Beispiel also von SOURCE_PATH = BASEPATH / "Ausgangsordner" nach DESTINATION_PATH = BASEPATH / "Empfangsordner". Wenn ich aber den Befehl wie folgt schreibe sourcefile.rename(SOURCE_PATH, DESTINATION_PATH) kommt wie erwähnt die Meldung, dass ich drei Argumente geliefert habe. Aber ich habe doch lediglich SOURCE_PATH und DESTINATION_PATH als Argumente, was ist denn das dritte Argument?

Sorry für die dumme Frage, aber ich sehe es nicht.
Bebbi
User
Beiträge: 144
Registriert: Dienstag 21. April 2020, 19:21

wenn ich mit ein Argument entferne und z.B. mit sourcefile.rename(destination) arbeite, was vorher auch definiert wurde, kommt wieder die Meldung, dass die Datei bereits existiert.... Going to be crazy....
Benutzeravatar
__blackjack__
User
Beiträge: 13107
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Bebbi: Methoden auf Objekten haben als erstes Argument immer das Objekt selbst. Du musst hier den kompletten Namen angeben den die Datei haben wird, nicht nur den Pfad in dem das enden soll. Sonst ist das doch auch gar nicht eindeutig, denn das würde ja funktionieren wenn es den Zielpfad nicht geben würde, und die Datei hätte dann den Namen des letzten Verzeichnisses in dem Pfad. Also eben nicht Verzeichnis denn wenn es diesen Teil nicht gibt, ist das ja gar kein Verzeichnis.
„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

also, ich habe jetzt den gesamten Pfad eingefügt:

Code: Alles auswählen

ef 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" / name)
Da ja der Code entscheiden muss in welchen Ordner es schlussendlich kommt, aufgrund der Filter, nehme ich an, dass ich am Schluss mit / name arbeiten kann...

mit der Synthax scheint aber weiterhin etwas nicht zu stimmen, da jetzt folgende Meldung kommt:

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" / name)
TypeError: unsupported operand type(s) for /: 'str' and 'str'
>>> 
Benutzeravatar
__blackjack__
User
Beiträge: 13107
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: 13107
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: 13107
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: 17750
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