Es scheint, dass cp kein Systemaufruf ist und daher nicht zum Betriebssystemmodul gehört. Da es sich um einen Shell-Befehl handelt, wird er in das Shutil-Modul eingefügt.
Waldol1
Antworten:
3008
shutilhat viele Methoden, die Sie verwenden können. Eines davon ist:
from shutil import copyfile
copyfile(src, dst)
Kopieren Sie den Inhalt der Datei mit dem Namen src in eine Datei mit dem Namen dst .
Der Zielort muss beschreibbar sein. Andernfalls wird eine IOError- Ausnahme ausgelöst .
Wenn dst bereits vorhanden ist, wird es ersetzt.
Spezielle Dateien wie Zeichen- oder Blockgeräte und Pipes können mit dieser Funktion nicht kopiert werden.
Bei copy sind src und dst Pfadnamen, die als Zeichenfolgen angegeben werden .
Wenn Sie os.pathOperationen verwenden, verwenden Sie copystatt copyfile. copyfilewird nur Strings akzeptieren .
Was ist der Unterschied zwischen Kopie und Kopierdatei?
Matt
386
In copy (src, dst) kann dst ein Verzeichnis sein.
Owen
41
Beachten Sie, dass abhängig von Ihrer Plattform nicht alle Metadaten kopiert werden.
Kevin Horn
12
Beachten Sie, dass es sich nicht um eine atomare Operation handelt. Seien Sie vorsichtig, wenn Sie es in einer Gewindeanwendung verwenden.
Wasserbyte
4
Beachten Sie, dass es keine Abkürzungen wie verarbeiten kann ~, aber relative Pfade verarbeiten kann
zwep
1252
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│ Function │ Copies │ Copies │Can use│ Destination │
│ │metadata│permissions│buffer │may be directory│
├──────────────────┼────────┼───────────┼───────┼────────────────┤
│shutil.copy │ No │ Yes │ No │ Yes │
│shutil.copyfile │ No │ No │ No │ No │
│shutil.copy2 │ Yes │ Yes │ No │ Yes │
│shutil.copyfileobj│ No │ No │ Yes │ No │
└──────────────────┴────────┴───────────┴───────┴────────────────┘
Es kann dstein Verzeichnis sein (anstelle des vollständigen Zieldateinamens). In diesem Fall wird der Basisname von srczum Erstellen der neuen Datei verwendet.
Die ursprünglichen Änderungs- und Zugriffsinformationen (mtime und atime) in den Dateimetadaten bleiben erhalten (dies ist jedoch mit einem geringen Overhead verbunden).
Hier ist ein kurzes Beispiel:
import shutil
shutil.copy2('/src/dir/file.ext','/dst/dir/newname.ext')# complete target filename given
shutil.copy2('/src/file.ext','/dst/dir')# target filename is /dst/dir/file.ext
Ich versuche, zufällig 100.000 Dateien von 1 Million Dateien zu kopieren. copyfileist erheblich schneller alscopy2
Vijay
4
Kann ich zu Recht davon ausgehen, dass shutil.copy2('/dir/file.ext', '/new/dir/')(mit einem Schrägstrich nach dem Zielpfad) die Unklarheit darüber beseitigt wird, ob in eine neue Datei mit dem Namen "dir" kopiert oder die Datei in ein Verzeichnis mit diesem Namen gestellt werden soll?
Zak
1
@ Vijay Ich glaube, dieser Overhead ist auf das Kopieren der Metadaten zurückzuführen.
Jonathan H
@Zak Es gibt keine Unklarheit, ob /new/direin Verzeichnis vorhanden ist, siehe @ MatthewAlperts Kommentar.
Jonathan H
@Zak Sie haben Recht, wenn Sie am Ende einen Schrägstrich hinzufügen, wird die Mehrdeutigkeit beseitigt. Wenn /new/dir/dies nicht vorhanden ist, wirft Python ein IsADirectoryError, andernfalls kopiert es die Datei /new/dir/unter dem ursprünglichen Namen.
Martinbognar
125
Sie können eine der Kopierfunktionen aus dem shutilPaket verwenden:
Nur neugierig, wie haben Sie diese Tabelle erstellt?
Lichtchemiker
16
@lightalchemist Ich habe gerade vim als Notizblock verwendet, die verwendeten Unicode-Symbole aus einer Wikipedia-Tabelle kopiert und das Ergebnis zum endgültigen Polieren in den Stackoverflow-Editor kopiert.
@wim, du musst meine Antwort mit der 2017er Version der Antwort vergleichen, die du verlinkt hast und die aktuell war, als ich meine Antwort gepostet habe. Hauptunterschiede: Meine Antwort verwendet bessere / aussagekräftigere Spaltenüberschriften, das Tabellenlayout lenkt nicht ab, es enthält direkte Links in die Dokumentation und ich habe eine Spalte hinzugefügt (dh 'akzeptiert Dateiobjekt').
Maxschlepzig
4
OK. YMMV, aber ich denke, dass kosmetische Änderungen und kleinere Verbesserungen wie diese besser als Änderungen an vorhandenen Antworten vorgenommen werden, als als doppelte Antworten.
os.popen(cmd[, mode[, bufsize]])# example# In Unix/Linux
os.popen('cp source.txt destination.txt')# In Windows
os.popen('copy source.txt destination.txt')
subprocess.call(args,*, stdin=None, stdout=None, stderr=None, shell=False)# example (WARNING: setting `shell=True` might be a security-risk)# In Linux/Unix
status = subprocess.call('cp source.txt destination.txt', shell=True)# In Windows
status = subprocess.call('copy source.txt destination.txt', shell=True)
subprocess.check_output(args,*, stdin=None, stderr=None, shell=False, universal_newlines=False)# example (WARNING: setting `shell=True` might be a security-risk)# In Linux/Unix
status = subprocess.check_output('cp source.txt destination.txt', shell=True)# In Windows
status = subprocess.check_output('copy source.txt destination.txt', shell=True)
Die Verwendung von Befehlen mit einer Zeichenfolge ist ein schlechter Codierungsstil (Flexibilität, Zuverlässigkeit und Sicherheit). Verwenden Sie stattdessen nach Möglichkeit ['copy', sourcefile, destfile]Syntax, insbesondere wenn die Parameter von Benutzereingaben stammen.
Marcel Waldvogel
8
Warum listen Sie so viele schlechte Alternativen zu den Shutil-Kopierfunktionen auf?
Maxschlepzig
6
Shutil ist eingebaut, es müssen keine nicht tragbaren Alternativen bereitgestellt werden. Die Antwort könnte tatsächlich verbessert werden, indem die systemabhängigen Lösungen entfernt werden. Nach dieser Entfernung ist diese Antwort nur eine Kopie der vorhandenen Antworten / eine Kopie der Dokumentation.
Jean-François Fabre
3
os.popenist jetzt schon eine Weile veraltet. und check_outputgibt nicht den Status zurück, sondern die Ausgabe (die im Fall von leer ist copy/cp)
Jean-François Fabre
2
shutil kopiert keine Dateien. Es gibt eine große fette Warnung ganz oben in den Dokumenten . "Dies bedeutet, dass Dateieigentümer und -gruppe sowie ACLs verloren gehen. Unter Mac OS werden der Ressourcengabel und andere Metadaten nicht verwendet. Dies bedeutet, dass Ressourcen verloren gehen und Dateityp- und Erstellercodes nicht korrekt sind. Unter Windows Dateibesitzer, ACLs und alternative Datenströme werden nicht kopiert. "
Gman
96
Das Kopieren einer Datei ist relativ einfach, wie in den folgenden Beispielen gezeigt. Sie sollten jedoch stattdessen das Modul shutil stdlib verwenden .
def copyfileobj_example(source, dest, buffer_size=1024*1024):"""
Copy a file from source to dest. source and dest
must be file-like objects, i.e. any object with a read or
write method, like for example StringIO.
"""whileTrue:
copy_buffer = source.read(buffer_size)ifnot copy_buffer:break
dest.write(copy_buffer)
Wenn Sie nach Dateinamen kopieren möchten, können Sie Folgendes tun:
def copyfile_example(source, dest):# Beware, this example does not handle any edge cases!with open(source,'rb')as src, open(dest,'wb')as dst:
copyfileobj_example(src, dst)
Ich bemerkte eine Weile her , dass das Modul shutil genannt wird (Singular) und nicht shutils (Plural), und in der Tat es ist in Python 2.3. Trotzdem lasse ich diese Funktion hier als Beispiel.
pi.
4
Das Kopieren des Inhalts einer Datei ist unkompliziert. Das Kopieren der Datei mit ihren Metadaten ist alles andere als einfach, umso mehr, wenn Sie plattformübergreifend sein möchten.
LaC
3
Wahr. Wenn Sie sich die Shutil-Dokumente ansehen, kopiert die Copyfile-Funktion auch keine Metadaten.
pi.
3
Ja, ich bin mir nicht sicher, warum Sie nicht einfach die Quelle von kopieren würden shutil.copyfileobj. Außerdem müssen Sie try, finallydie Dateien nach Ausnahmen nicht schließen. Ich würde jedoch sagen, dass Ihre Funktion überhaupt nicht für das Öffnen und Schließen der Dateien verantwortlich sein sollte. Das sollte in einer Wrapper-Funktion gehen, wie shutil.copyfileWraps shutil.copyfileobj.
ErlVolton
2
Der obige Code sollte spezifizierbar destsein:open(dest, 'wb')
Kopieren Sie den Inhalt der Datei mit dem Namen src in eine Datei mit dem Namen dst. Der Zielort muss beschreibbar sein. Andernfalls wird eine IOError-Ausnahme ausgelöst. Wenn dst bereits vorhanden ist, wird es ersetzt. Spezielle Dateien wie Zeichen- oder Blockgeräte und Pipes können mit dieser Funktion nicht kopiert werden. src und dst sind Pfadnamen, die als Zeichenfolgen angegeben werden.
In filesys finden Sie alle Funktionen zur Datei- und Verzeichnisbehandlung, die in Standard-Python-Modulen verfügbar sind.
shutil kopiert keine Dateien. Es gibt eine große fette Warnung ganz oben in den Dokumenten . "Dies bedeutet, dass Dateieigentümer und -gruppe sowie ACLs verloren gehen. Unter Mac OS werden der Ressourcengabel und andere Metadaten nicht verwendet. Dies bedeutet, dass Ressourcen verloren gehen und Dateityp- und Erstellercodes nicht korrekt sind. Unter Windows Dateibesitzer, ACLs und alternative Datenströme werden nicht kopiert. "
Gman
47
Beispiel für eine Verzeichnis- und Dateikopie - Aus Tim Goldens Python-Material:
shutil kopiert keine Dateien. Es gibt eine große fette Warnung ganz oben in den Dokumenten . "Dies bedeutet, dass Dateieigentümer und -gruppe sowie ACLs verloren gehen. Unter Mac OS werden der Ressourcengabel und andere Metadaten nicht verwendet. Dies bedeutet, dass Ressourcen verloren gehen und Dateityp- und Erstellercodes nicht korrekt sind. Unter Windows Dateibesitzer, ACLs und alternative Datenströme werden nicht kopiert. "
Gman
19
Für kleine Dateien und nur mit Python-integrierten Funktionen können Sie den folgenden Einzeiler verwenden:
with open(source,'rb')as src, open(dest,'wb')as dst: dst.write(src.read())
Wie @maxschlepzig unten in den Kommentaren erwähnt, ist dies nicht optimal für Anwendungen , bei denen die Datei zu groß ist oder wenn der Speicher kritisch ist, so Swati der sollte Antwort bevorzugt werden.
Dadurch wird die gesamte Quelldatei in den Speicher eingelesen, bevor sie zurückgeschrieben wird. Dadurch wird unnötigerweise Speicher für alle außer den kleinsten Dateikopiervorgängen verschwendet.
Maxschlepzig
1
Ist das wahr? Ich denke .read()und .write()sind standardmäßig gepuffert (zumindest für CPython).
Soundstripe
@ Soundstripe, natürlich ist das wahr. Die Tatsache, dass das von zurückgegebene open()Dateiobjekt standardmäßig gepufferte E / A-Vorgänge ausführt, hilft Ihnen hier nicht weiter, da read()Folgendes angegeben wird: "Wenn n negativ ist oder weggelassen wird, lesen Sie bis EOF." Das bedeutet, dass der read()gesamte Dateiinhalt als Zeichenfolge zurückgegeben wird.
Maxschlepzig
@maxschlepzig Ich verstehe Ihren Standpunkt und ich gebe zu, dass ich mir dessen nicht bewusst war. Der Grund, warum ich diese Antwort gegeben habe, war für den Fall, dass jemand eine einfache Dateikopie nur mit integrierten Funktionen erstellen wollte, ohne ein Modul dafür importieren zu müssen. Natürlich sollte die Speicheroptimierung kein Problem sein, wenn Sie diese Option wünschen. Trotzdem danke, dass du das geklärt hast. Ich habe die Antwort entsprechend aktualisiert.
Yellow01
14
Du könntest benutzen os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
oder wie ich es getan habe,
os.system('cp '+ rawfile +' rawdata.dat')
Wo rawfileist der Name, den ich im Programm generiert hatte?
Dies ist nicht portabel und unnötig, da Sie nur shutil verwenden können.
Corey Goldberg
4
Auch wenn shutiles nicht verfügbar ist - subprocess.run() (ohne shell=True!) Ist die bessere Alternative zu os.system().
Maxschlepzig
1
Shutil ist tragbarer
Hiadore
1
subprocess.run()Wie von @maxschlepzig vorgeschlagen, ist dies ein großer Schritt nach vorne, wenn externe Programme aufgerufen werden. Verwenden Sie für Flexibilität und Sicherheit jedoch die ['cp', rawfile, 'rawdata.dat']Form der Übergabe der Befehlszeile. (Zum Kopieren wird shutiljedoch empfohlen , Freunde über ein externes Programm aufzurufen.)
Marcel Waldvogel
2
Versuchen Sie das mit Dateinamen mit Leerzeichen.
Jean-François Fabre
11
Bei großen Dateien habe ich die Datei Zeile für Zeile gelesen und jede Zeile in ein Array eingelesen. Wenn das Array eine bestimmte Größe erreicht hat, hängen Sie es an eine neue Datei an.
for line in open("file.txt","r"):
list.append(line)if len(list)==1000000:
output.writelines(list)del list[:]
Dies scheint ein wenig überflüssig zu sein, da der Writer die Pufferung übernehmen sollte. for l in open('file.txt','r'): output.write(l)sollte arbeiten finden; Richten Sie einfach den Ausgabestream-Puffer nach Ihren Wünschen ein. oder Sie können durch Schleifen über einen Versuch durch die Bytes gehen mit , output.write(read(n)); output.flush()wo ndie Anzahl der Bytes , die Sie zu einem Zeitpunkt , zu schreiben möchten. Beide haben auch keine Bedingung, um zu überprüfen, was ein Bonus ist.
besitzt
1
Ja, aber ich dachte, dass dies möglicherweise einfacher zu verstehen ist, da ganze Zeilen und nicht Teile davon kopiert werden (falls wir nicht wissen, wie viele Bytes jede Zeile enthält).
Ytpillai
Sehr richtig. Die Codierung für den Unterricht und die Codierung für die Effizienz sind sehr unterschiedlich.
Das ist schrecklich. Es macht unnötige Arbeit ohne guten Grund. Es funktioniert nicht für beliebige Dateien. Die Kopie ist nicht byteidentisch, wenn die Eingabe auf Systemen wie Windows ungewöhnliche Zeilenenden aufweist. Warum ist dies Ihrer Meinung nach möglicherweise leichter zu verstehen als ein Aufruf einer Kopierfunktion in shutil? Selbst wenn dies ignoriert wird shutil, ist eine einfache Block-Lese- / Schreibschleife (unter Verwendung ungepufferter E / A) unkompliziert, effizient und sinnvoller als diese und daher sicherlich leichter zu lehren und zu verstehen.
Maxschlepzig
11
from subprocess import call
call("cp -p <file> <file>", shell=True)
Und dann verwendet jemand den Code (versehentlich oder absichtlich) für eine große Datei. Die Verwendung von Funktionen von shutilbehandelt alle Sonderfälle für Sie und gibt Ihnen Sicherheit.
Marcel Waldvogel
4
Zumindest werden die gleichen Lösungen nicht immer wieder wiederholt.
Die Idee ist nett und der Code ist schön, aber eine ordnungsgemäße copy () - Funktion kann mehr bewirken, z. B. das Kopieren von Attributen (+ x Bit) oder das Löschen der bereits kopierten Bytes, falls eine Bedingung gefunden wird, bei der die Festplatte voll ist .
Raúl Salinas-Monteagudo
1
Alle Antworten müssen erklärt werden, auch wenn es sich um einen Satz handelt. Keine Erklärung stellt einen schlechten Präzedenzfall dar und ist nicht hilfreich für das Verständnis des Programms. Was wäre, wenn ein kompletter Python-Noob vorbeikäme und dies sehen würde, es verwenden wollte, es aber nicht konnte, weil sie es nicht verstehen? Sie möchten allen bei Ihren Antworten behilflich sein.
Verbinden Sie Ihr Ladegerät
1
Fehlt das nicht .close()bei all diesen open(...)?
Glückydonald
Keine Notwendigkeit von .close (), da wir das Dateizeigerobjekt nirgendwo speichern (weder für die src-Datei noch für die Zieldatei).
Antworten:
shutil
hat viele Methoden, die Sie verwenden können. Eines davon ist:Wenn Sie
os.path
Operationen verwenden, verwenden Siecopy
stattcopyfile
.copyfile
wird nur Strings akzeptieren .quelle
~
, aber relative Pfade verarbeiten kannquelle
copy2(src,dst)
ist oft nützlicher alscopyfile(src,dst)
weil:dst
ein Verzeichnis sein (anstelle des vollständigen Zieldateinamens). In diesem Fall wird der Basisname vonsrc
zum Erstellen der neuen Datei verwendet.Hier ist ein kurzes Beispiel:
quelle
copyfile
ist erheblich schneller alscopy2
shutil.copy2('/dir/file.ext', '/new/dir/')
(mit einem Schrägstrich nach dem Zielpfad) die Unklarheit darüber beseitigt wird, ob in eine neue Datei mit dem Namen "dir" kopiert oder die Datei in ein Verzeichnis mit diesem Namen gestellt werden soll?/new/dir
ein Verzeichnis vorhanden ist, siehe @ MatthewAlperts Kommentar./new/dir/
dies nicht vorhanden ist, wirft Python einIsADirectoryError
, andernfalls kopiert es die Datei/new/dir/
unter dem ursprünglichen Namen.Sie können eine der Kopierfunktionen aus dem
shutil
Paket verwenden:Beispiel:
quelle
In Python können Sie die Dateien mit kopieren
shutil
Modulos
Modulsubprocess
Modul1) Kopieren von Dateien mit dem
shutil
Modulshutil.copyfile
Unterschriftshutil.copy
Unterschriftshutil.copy2
Unterschriftshutil.copyfileobj
Unterschrift2) Kopieren von Dateien mit dem
os
Modulos.popen
Unterschriftos.system
Unterschrift3) Kopieren von Dateien mit dem
subprocess
Modulsubprocess.call
Unterschriftsubprocess.check_output
Unterschriftquelle
['copy', sourcefile, destfile]
Syntax, insbesondere wenn die Parameter von Benutzereingaben stammen.os.popen
ist jetzt schon eine Weile veraltet. undcheck_output
gibt nicht den Status zurück, sondern die Ausgabe (die im Fall von leer istcopy/cp
)Das Kopieren einer Datei ist relativ einfach, wie in den folgenden Beispielen gezeigt. Sie sollten jedoch stattdessen das Modul shutil stdlib verwenden .
Wenn Sie nach Dateinamen kopieren möchten, können Sie Folgendes tun:
quelle
shutil.copyfileobj
. Außerdem müssen Sietry, finally
die Dateien nach Ausnahmen nicht schließen. Ich würde jedoch sagen, dass Ihre Funktion überhaupt nicht für das Öffnen und Schließen der Dateien verantwortlich sein sollte. Das sollte in einer Wrapper-Funktion gehen, wieshutil.copyfile
Wrapsshutil.copyfileobj
.dest
sein:open(dest, 'wb')
Verwenden Sie das Shutil-Modul .
Kopieren Sie den Inhalt der Datei mit dem Namen src in eine Datei mit dem Namen dst. Der Zielort muss beschreibbar sein. Andernfalls wird eine IOError-Ausnahme ausgelöst. Wenn dst bereits vorhanden ist, wird es ersetzt. Spezielle Dateien wie Zeichen- oder Blockgeräte und Pipes können mit dieser Funktion nicht kopiert werden. src und dst sind Pfadnamen, die als Zeichenfolgen angegeben werden.
In filesys finden Sie alle Funktionen zur Datei- und Verzeichnisbehandlung, die in Standard-Python-Modulen verfügbar sind.
quelle
Beispiel für eine Verzeichnis- und Dateikopie - Aus Tim Goldens Python-Material:
http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html
quelle
Zunächst habe ich ein ausführliches Cheatsheet mit Shutil-Methoden als Referenz erstellt.
Zweitens erklären Sie die Kopiermethoden in Beispielen:
Kopieren Sie rekursiv einen gesamten Verzeichnisbaum, der auf src verwurzelt ist, und geben Sie das Zielverzeichnis zurück
quelle
Für kleine Dateien und nur mit Python-integrierten Funktionen können Sie den folgenden Einzeiler verwenden:
Wie @maxschlepzig unten in den Kommentaren erwähnt, ist dies nicht optimal für Anwendungen , bei denen die Datei zu groß ist oder wenn der Speicher kritisch ist, so Swati der sollte Antwort bevorzugt werden.
quelle
.read()
und.write()
sind standardmäßig gepuffert (zumindest für CPython).open()
Dateiobjekt standardmäßig gepufferte E / A-Vorgänge ausführt, hilft Ihnen hier nicht weiter, daread()
Folgendes angegeben wird: "Wenn n negativ ist oder weggelassen wird, lesen Sie bis EOF." Das bedeutet, dass derread()
gesamte Dateiinhalt als Zeichenfolge zurückgegeben wird.Du könntest benutzen
os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
oder wie ich es getan habe,
Wo
rawfile
ist der Name, den ich im Programm generiert hatte?Dies ist eine reine Linux-Lösung
quelle
shutil
es nicht verfügbar ist -subprocess.run()
(ohneshell=True
!) Ist die bessere Alternative zuos.system()
.subprocess.run()
Wie von @maxschlepzig vorgeschlagen, ist dies ein großer Schritt nach vorne, wenn externe Programme aufgerufen werden. Verwenden Sie für Flexibilität und Sicherheit jedoch die['cp', rawfile, 'rawdata.dat']
Form der Übergabe der Befehlszeile. (Zum Kopieren wirdshutil
jedoch empfohlen , Freunde über ein externes Programm aufzurufen.)Bei großen Dateien habe ich die Datei Zeile für Zeile gelesen und jede Zeile in ein Array eingelesen. Wenn das Array eine bestimmte Größe erreicht hat, hängen Sie es an eine neue Datei an.
quelle
for l in open('file.txt','r'): output.write(l)
sollte arbeiten finden; Richten Sie einfach den Ausgabestream-Puffer nach Ihren Wünschen ein. oder Sie können durch Schleifen über einen Versuch durch die Bytes gehen mit ,output.write(read(n)); output.flush()
won
die Anzahl der Bytes , die Sie zu einem Zeitpunkt , zu schreiben möchten. Beide haben auch keine Bedingung, um zu überprüfen, was ein Bonus ist.shutil
? Selbst wenn dies ignoriert wirdshutil
, ist eine einfache Block-Lese- / Schreibschleife (unter Verwendung ungepufferter E / A) unkompliziert, effizient und sinnvoller als diese und daher sicherlich leichter zu lehren und zu verstehen.quelle
call
ist unsicher. Bitte beachten Sie das dazugehörige Dokument.Ab Python 3.5 können Sie für kleine Dateien (z. B. Textdateien, kleine JPEGs) Folgendes tun:
write_bytes
überschreibt alles, was sich am Zielort befandquelle
shutil
behandelt alle Sonderfälle für Sie und gibt Ihnen Sicherheit.Öffnen Sie die Quelldatei im Lesemodus und schreiben Sie im Schreibmodus in die Zieldatei.
quelle
.close()
bei all diesenopen(...)
?Python bietet integrierte Funktionen zum einfachen Kopieren von Dateien mit den Betriebssystem-Shell-Dienstprogrammen.
Der folgende Befehl wird zum Kopieren der Datei verwendet
Der folgende Befehl wird verwendet, um eine Datei mit MetaData-Informationen zu kopieren
quelle
copy
dann ausführencopystat
, um Dateimetadaten beizubehalten. In Python 3.3+ werdencopystat
auch erweiterte Attribute kopiert.