Ordner als variable?

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.
Antworten
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

Hi,
irgendwie bekomme ich immer einen Fehler, aber komm nicht dahinter was ich anders machen muss

Code: Alles auswählen

watchfolder='C:\watchfolder'
shutil.move(downloadpath,watchfolder)
PermissionError: [WinError 32] Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird: 'C:\\watchfolder\\tmp'
danke im voraus! :)
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Das Problem hat mit dem Python-Code nichts zu tun, sondern damit dass du damit Dateien in den Zielordner verschiebst und es die gleichnamige Datei dort ueberschreiben wuerde.
Das laesst Windows aber nicht zu, da sie noch geoeffnet ist, siehe Fehlermeldung.
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

Der Ordner ist aber komplett leer davor :/
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

capitalG hat geschrieben:

Code: Alles auswählen

watchfolder='C:\watchfolder'
Unabhängig von der Fehlermeldung ist deine Art der Pfadangabe potenziell falsch. Ein Backslash in einem String leitet eine Escape-Sequenz ein. '\w' ist nun aktuell zum Glück kein besonderes Zeichen, aber mit beispielsweise '\t' würdest du schon auf die Nase fallen. Verwende daher einen zusätzlichen Backslash um den Backslash selber zu escapen oder benutze im Code einen raw-string.

Code: Alles auswählen

# mit Escape
watchfolder = 'C:\\watchfolder'

#mit raw-string
watchfolder = r'C:\watchfolder'
capitalG
User
Beiträge: 14
Registriert: Donnerstag 20. Februar 2014, 16:25

Schonmal Danke für den Tipp mit r :)
Aber was ist den nun der effektivste Weg um alle Dateien in einem Ordner in einen anderen zu verschieben? Sind gerade mal 2.

edit: habs jetzt mit

Code: Alles auswählen

shutil.copyfile(os.listdir(downloadpath)[0],watchfolder+'.1')
shutil.copyfile(os.listdir(downloadpath)[1],watchfolder+'.2')
hinbekommen. Ich weiss zwar nicht warum ich '+.1' dahinter schreiben muss, ansonsten gibts einen Fehler, aber naja, funktioniert schon irgendwie erstmal bis ich es eleganter mache.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

capitalG hat geschrieben:edit: habs jetzt mit

Code: Alles auswählen

shutil.copyfile(os.listdir(downloadpath)[0],watchfolder+'.1')
shutil.copyfile(os.listdir(downloadpath)[1],watchfolder+'.2')
hinbekommen.
Das wirkt nicht schön. os.listdir liefert die Informationen nicht in einer bewusst sortierten Reihenfolge. Solltest du also davon ausgehen, dass immer die alphabetisch ersten Dateien kopiert werden, dann ist das falsch. Zudem ist der doppelte Aufruf von os.listdir unglücklich. Ruf das einmal auf und halte das Ergebnis fest.

Problematisch ist weiterhin, dass os.listdir nur die Namen der Dateien liefert, nicht den kompletten Pfad. Wenn du dein Programm nicht explizit aus dem Ordner downloadpath heraus aufrufst wird das nicht funktionieren.

Dann hast du auch noch ein Problem mit der Zielangabe. shutil.copyfile möchte den kompletten Namen der Zieldatei haben. Nur shutil.copy akzeptiert auch einen Pfadnamen als Ziel.

Abschließend sei noch angemerkt, dass du von "Verschieben" sprichst, in deinem Code aber Kopierroutinen verwendest. Für das Verschieben solltest du shutil.move verwenden.
Antworten