Spezielle Daten verschieben
- __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
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.
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.
- __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
also, ich habe jetzt den gesamten Pfad eingefügt:
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
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)
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'
>>>
- __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:
Was hätte denn da anderes als die Ausnahme als Ergebnis kommen sollen und warum?
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'
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Habe den Code jetzt wie folgt angepasst.
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:
Es gibt wohl Sachen die werde ich nie begreifen...
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()
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'
>>>
- __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
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:
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.
Ich drehe mich im Kreis, weiss aber wirlich nicht, was ich noch ausprobieren soll. Der Fehler muss doch bei diesem sourcefile.rename() liegen.....
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/")
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/'
>>>
- __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.
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
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
Also
Code: Alles auswählen
sourcefilename.rename(destination / sourcefilename.name)