copytree Dateipfad zurückgeben

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.
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

Hallo Leute,

ich Kopiere ein Verzeichnis samt unter Ordner und alle Dateien mit shutil.copytree.
Soweit geht auch alles. Gibt es eine Möglichkeit während des Kopiervorgangs den Dateipfad und den Dateinamen auszugeben der gerade Kopiert wird.

Danke...
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PeterL: Man kann eine `copy_function` übergeben.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

__blackjack__ hat geschrieben: Freitag 11. Februar 2022, 23:29 @PeterL: Man kann eine `copy_function` übergeben.
Hallo, und wie genau macht man das ?
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@PeterL: Naja, beim Aufruf halt. Die Funktion muss die gleiche Signatur haben wie `shutil.copy2()`. Steht aber auch in der Dokumentation.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nicht nur die gleiche Signatur, sie muss die]] auch Selbst aufrufen, weil die ja eigentlich dazu gedacht ist, zu kopieren. Sowas hier wäre ein Anfang:

Code: Alles auswählen

def report_and_copy(*args):
    print(args)
    shutil.copy2(*args)
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

__deets__ hat geschrieben: Samstag 12. Februar 2022, 09:42 Nicht nur die gleiche Signatur, sie muss die]] auch Selbst aufrufen, weil die ja eigentlich dazu gedacht ist, zu kopieren. Sowas hier wäre ein Anfang:

Code: Alles auswählen

def report_and_copy(*args):
    print(args)
    shutil.copy2(*args)
Hallo und guten Tag,

ich verstehe das Beispiel nicht, wie kann ich es ausführen.
Es muss doch ein Rückgabewert geben den man eintragen kann.
Wie genau macht man das ? Hast du vielleicht ein nachvollziehbares Beispiel ?

Danke...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Es muss keinen rückgabewert geben. Und diese Funktion muss einfach nur übergeben werden als Argument. Hast du das einfach mal probiert? Wenn ja, wi3 sieht das aus?
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

__deets__ hat geschrieben: Samstag 12. Februar 2022, 14:27 Es muss keinen rückgabewert geben. Und diese Funktion muss einfach nur übergeben
Ich weis gar nicht wie ich etwas übergeben muss.
Ich benutze das so:

Code: Alles auswählen

import shutil  
src = 'C:/Temp/'
dest = 'E:/Temp'
shutil.copytree(src, dest)  
Es läuft alles. Ich möchte aber gerne mit print den Dateinamen und Pfad ausgeben der gerade
kopiert wird ? Wenn ich es so laufen lasse zieht man nichts.

Bis dann...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

src und fest übergibst du doch auch. das sind Argumente. Und Argumente an Funktionen übergeben ist ja nun absolute Grundlage. Wenn du das nicht kannst, muss ein Tutorial her.
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

__deets__ hat geschrieben: Samstag 12. Februar 2022, 14:37 src und fest übergibst du doch auch. Wenn du das nicht kannst, muss ein Tutorial her.
Es muss doch bei der shutil.copytree(src, dest) die Möglichkeit geben ein Parameter anzugeben.

ZB shutil.copytree(src, dest,RückgabeDateiNamenUndPfad)
print (RückgabeDateiNamenUndPfad)

Bis dann...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja. Über die Funktion. Und die übergibt man als Argument. Weil mit Argumenten sagt man einer Funktion, was sie tun soll. Machst du mit Quelle und Ziel ja auch.
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

__deets__ hat geschrieben: Samstag 12. Februar 2022, 14:48 Ja. Über die Funktion. Und die übergibt man als Argument. Weil mit Argumenten sagt man einer Funktion, was sie tun soll. Machst du mit Quelle und Ziel ja auch.
Hallo,

was für ein Argument soll das sein, wie heist das.
Ich weis was ich mit shutil so alles machen kann. Leider habe ich noch nichts bei Google gefunden. Könntest du mir bitte sagen wie das Argument heist ?

Bis dann...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das hat __blackjack__ doch schon getan. copy_function. Steht auch in der Doku. Hast du die mal angeschaut?

https://docs.python.org/3/library/shuti ... l.copytree
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

__deets__ hat geschrieben: Samstag 12. Februar 2022, 15:17 copy_function. Steht auch in der Doku. Hast du die mal angeschaut?

https://docs.python.org/3/library/shuti ... l.copytree
Hallo,

ich möchte keine einzelnen Dateien kopieren, sondern ganze Verzeichnisse.
Ich möchte während des Kopierens mir den Pfad und den Dateinamen ausgeben lassen.
So wie os.walk es macht. Ja die Anleitung habe ich gelesen und nichts gefunden.

Bis dann...
Benutzeravatar
ThomasL
User
Beiträge: 1379
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

@PeterL

Die Doku zu shutil.copytree()
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)

If copy_function is given, it must be a callable that will be used to copy each file. It will be called with the source path and the destination path as arguments. By default, copy2() is used, but any function that supports the same signature (like copy()) can be used.
Basierend auf deinem Beispiel und dem Code von __deets__ sieht das dann so aus:

Code: Alles auswählen

import shutil  
src = 'C:/Temp/'
dest = 'E:/Temp'

def report_and_copy(*args):
    print(args)
    shutil.copy2(*args)

shutil.copytree(src, dest, copy_function=report_and_copy)  
VG Thomas
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

ThomasL hat geschrieben: Samstag 12. Februar 2022, 15:51 @PeterL

Die Doku zu shutil.copytree()
shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)
Basierend auf deinem Beispiel und dem Code von __deets__ sieht das dann so aus:

Code: Alles auswählen

import shutil  
src = 'C:/Temp/'
dest = 'E:/Temp'

def report_and_copy(*args):
    print(args)
    shutil.copy2(*args)

shutil.copytree(src, dest, copy_function=report_and_copy)  
VG Thomas
Hallo danke sehr freundlich der Code läuft.
Ich habe da noch eine Frage zu deinem Code.
Wie genau funktioniert der. Ich meine das copy2 die Dateien kopiert.
Und copytree in dem Beispiel die Dateiordner anlegt. Ist das richtig.?
Was ich nicht nachvollziehen kann ist was macht def report_and_copy(*args):

Danke.. Bis dann...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

In der nun inzwischen schon mehrfach erwaehnten Dokumentation steht, dass copytree zum kopieren der einzelnen Dateien copy2 benutzt. Aber man kann eben auch eine andere funktion uebergeben. Die muss dann die gleiche Aufgabe erledigen. Und das macht man am sinnvollsten, indem man einfach copy2 benutzt, denn da weiss man ja schon, was die macht. Und ausserdem kann man noch mehr machen. Wie eben die gerade zu kopierenden Dateien ausgeben. So wie du dir das wuenschst.
PeterL
User
Beiträge: 95
Registriert: Samstag 6. März 2021, 18:39

__deets__ hat geschrieben: Samstag 12. Februar 2022, 16:32 In der nun inzwischen schon mehrfach erwaehnten Dokumentation steht, dass copytree zum kopieren der einzelnen Dateien copy2 benutzt. Und ausserdem kann man noch mehr machen. Wie eben die gerade zu kopierenden Dateien ausgeben. So wie du dir das wuenschst.
Hallo,

das ich zusätzlich noch copy2 benutzen muss das Wuste ich nicht.
Ich bin davon ausgegangen das copytree auch ohne zusätzlich copy2 den Dateipfad zurückgeben kann. Mir ging es in erster Line darum das ich nicht erst die Verzeichnisse anlegen muss um mit ,nur copy2 Dateien zu kopieren. Deswegen benutzte ich copytree.
Ich habe mir zuerst eine eigene Routine gebastelt.

Code: Alles auswählen

import shutil 
import os

src = 'C:/Temp'
dest = 'E:/Temp'

for root, dirs, files in os.walk("c:\Temp", topdown=True):
   for name in files:
       print(os.path.join(root, name))
       
       try:    
           shutil.copytree(src, dest)
       except:
           pass
           for name in dirs:
      #print(os.path.join(root, name))
               pass
Das geht auch.

Wie kann ich aber der Funktion:

Code: Alles auswählen

def report_and_copy(*args):
Den Quellpfad und Ziel Pfad mit übergeben. ?
Und wie rufe ich dann die Funktion auf.?

Bis die Tage...
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

args sind die Argumente. Und aufgerufen wird die von copytree. Du hast doch behauptet, sie funktioniert. Warum willst du sie jetzt selbst aufrufen?
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

@PeterL: Deine Lösung macht keinen Sinn. Hast du das mal ausprobiert?
Da iterierst du über Dateien - und bei jeder Datei machst du ein copytree für src auf dest. Wenn das 20 Datein sind, kopierst du also 20 Mal 20 Dateien.
Diese vielen pass machen auch keinen Sinn. "pass" schreibt man, wenn man wenn man dem Interpreter mitteilen möchte, dass da Code komen sollte - aber keiner kommt.

Du solltest dir wirklich das Tutorial einmal anschauen. So gewisse Grundlagen muss man verstehen. Das geht nicht über raten. Auch wie Funktionen und deren Parameter funktionieren.
Antworten