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...
copytree Dateipfad zurückgeben
- __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
Hallo, und wie genau macht man das ?__blackjack__ hat geschrieben: Freitag 11. Februar 2022, 23:29 @PeterL: Man kann eine `copy_function` übergeben.
- __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
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,__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)
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...
Ich weis gar nicht wie ich etwas übergeben muss.__deets__ hat geschrieben: Samstag 12. Februar 2022, 14:27 Es muss keinen rückgabewert geben. Und diese Funktion muss einfach nur übergeben
Ich benutze das so:
Code: Alles auswählen
import shutil
src = 'C:/Temp/'
dest = 'E:/Temp'
shutil.copytree(src, dest)
kopiert wird ? Wenn ich es so laufen lasse zieht man nichts.
Bis dann...
Es muss doch bei der shutil.copytree(src, dest) die Möglichkeit geben ein Parameter anzugeben.__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.
ZB shutil.copytree(src, dest,RückgabeDateiNamenUndPfad)
print (RückgabeDateiNamenUndPfad)
Bis dann...
Hallo,__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.
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...
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
https://docs.python.org/3/library/shuti ... l.copytree
Hallo,__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
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...
@PeterL
Die Doku zu shutil.copytree()
VG Thomas
Die Doku zu shutil.copytree()
Basierend auf deinem Beispiel und dem Code von __deets__ sieht das dann so aus: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.
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)
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
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Hallo danke sehr freundlich der Code läuft.ThomasL hat geschrieben: Samstag 12. Februar 2022, 15:51 @PeterL
Die Doku zu shutil.copytree()Basierend auf deinem Beispiel und dem Code von __deets__ sieht das dann so aus:shutil.copytree(src, dst, symlinks=False, ignore=None, copy_function=copy2, ignore_dangling_symlinks=False, dirs_exist_ok=False)
VG ThomasCode: 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)
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...
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.
Hallo,__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.
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
Wie kann ich aber der Funktion:
Code: Alles auswählen
def report_and_copy(*args):
Und wie rufe ich dann die Funktion auf.?
Bis die Tage...
@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.
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.