Unterordner verschieben/kopieren

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
Enne1008
User
Beiträge: 6
Registriert: Montag 2. September 2019, 11:49

Liebe Mitglieder,

ich sitzt seit ein paar Tagen an einer kleinen Aufgabe und komme an einem Punkt nicht weiter.
Folgende Herausforderung habe ich.

Wir legen Projekte bei uns nach in folgender Hierachie ab. Projektpartner --> Projekte --> Einzelprojekt. So ist auch bei uns die Ordnerstruktur aufgebaut.

C:\Users\enrico.neubauer\PycharmProjects\verschieben\Quelle\61867_Das_Haus\Projekte\Projekt1
C:\Users\enrico.neubauer\PycharmProjects\verschieben\Quelle\61867_Das_Haus\Projekte\Projekt2

In diesen beiden Links (exemplarisch) ist der Ordner 61867... der Projektpartner und die Ordner "Projekt1" und "Projekt2" die jeweiligen Projekte.

Ich möchte nun alle Projekte aller Partner in einen einzigen separaten Ordner kopieren/verschieben

Im Ziel soll dies so aussehen.
C:\Users\enrico.neubauer\PycharmProjects\verschieben\senke\Projekt1
C:\Users\enrico.neubauer\PycharmProjects\verschieben\senke\Projekt2
.
.
.
C:\Users\enrico.neubauer\PycharmProjects\verschieben\senke\Projektn

Ich habe nun folgenden Code

Code: Alles auswählen

import os
import shutil

source = r"C:\Users\enrico.neubauer\PycharmProjects\verschieben\Quelle"
target = r"C:\Users\enrico.neubauer\PycharmProjects\verschieben\senke_1"
projects = os.listdir(source)

for project in projects:
    source_2 = os.path.join(source, project +"\\"+"Projekte"+"\\")
    shutil.move(source_2,target)

    
Es wird nun beim ersten Projekt, welches verschoben wird ein Unterordner "Projekte" angelegt, welcher bei nächste Durchlauf zur Meldung führt, dass der Pfad bereits exzistiert.

Könntet ihr mir bitte einen Tipp geben?

Besten Dank vorab.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Dann teste doch einfach, ob der Pfad existiert, und leg den nur bei Bedarf an.

Oder du benutzt gleich das besser pathlib statt der rudimentaeren os.*-Funktionen, und kannst bei mkdir angeben, ob das Verzeichnis schon existieren darf:

https://docs.python.org/3/library/pathl ... Path.mkdir
locky20
User
Beiträge: 4
Registriert: Samstag 27. Juni 2020, 15:56

Erst sicherstellen, ob ein Pfad bereits existiert und anschliessend die Aktion, oder verwende "try", "except" block. Macht manchmal schon Sinn, dafür ist ja auch da, um Fehler abzufangen.

Code: Alles auswählen

if not os.path.exists('/root/'):
    shutil.move('/root')

oder 

try: 
   shutil.move('root', 'new_root')
except shutil.error:
   pass
   
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@locky20: Aber so wie hier gezeigt, macht der except-Block keinen Sinn. Es gilt: Entweder man fängt einen Fehler ab und behandelt ihn, damit das Programm in einem kontrollierten Zustand weiterlaufen kann, oder man spart sich das Abfangen, der Fehler eskaliert und das Programm wird mit einer Fehlermeldung beendet.
Dein Beispiel hier verschluckt aber den Fehler. Keine Behandlung, keine Rückmeldung. Das ist nicht sinnvoll. Es ist sogar "gefährlich", denn wenn etwas schief läuft, kommt die nächste Nachfrage, warum es "einfach nicht funktioniert". Daher lieber keine nackten Excepts und keine Excepts ohne Behandlung.
lexx
User
Beiträge: 19
Registriert: Sonntag 23. Dezember 2018, 14:15

Bin jetzt nicht der Profi, aber für mich sieht es so aus, als würde der source Pfad komisch zusammengesetzt.

source_2 = os.path.join(source, project +"\\"+"Projekte"+"\\")
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Komisch ist ein sehr nettes Wort für „falsch“. Vor allem da ja `os.path.join()` an sich ja schon verwendet wird.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
lexx
User
Beiträge: 19
Registriert: Sonntag 23. Dezember 2018, 14:15

Wenn ich das richtig sehe, könnte es aber durchlaufen, wenn er den dazugebastelten Teil weglässt.
Enne1008
User
Beiträge: 6
Registriert: Montag 2. September 2019, 11:49

Guten Morgen,

vielen Dank für die Hinweise.
@lexx: Wenn ich den hinzugebastelten Teil weg lasse, wird die gesamte Ordnerstruktur verschoben. Ich benötige hingegen die Unterordner, welche im Ordner Projekte liegen.

Ich probiere dies nun einmal mit pathlib zulösen

Beste Grüße
Benutzeravatar
DeaD_EyE
User
Beiträge: 1240
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

Mit pathlib ist es einfacher.

Probiere mal das Globbing aus.

z.B.

Code: Alles auswählen

from pathlib import Path


source = Path(r"C:\Users\enrico.neubauer\PycharmProjects\verschieben\Quelle")
for projekt in source.glob("*\Projekte\*"):
    print(projekt)
Falls nichts ausgegeben wird, ist der Suchpfad mit den Wildcards falsch.
Da kannst du dann die Struktur so anpassen, dass dir nur die Projektverzeichnisse ausgegeben werden.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
lexx
User
Beiträge: 19
Registriert: Sonntag 23. Dezember 2018, 14:15

Enne1008 hat geschrieben: Montag 29. Juni 2020, 07:04 Guten Morgen,

vielen Dank für die Hinweise.
@lexx: Wenn ich den hinzugebastelten Teil weg lasse, wird die gesamte Ordnerstruktur verschoben. Ich benötige hingegen die Unterordner, welche im Ordner Projekte liegen.

Ich probiere dies nun einmal mit pathlib zulösen

Beste Grüße

Warum gibst du ihn denn nicht im Source pfad an?
Oder hab ich jetzt einen Denkfehler?
Antworten