Wie kopiere ich eine Datei in Python?

2477

Wie kopiere ich eine Datei in Python?

Ich konnte nichts darunter finden os.

Matt
quelle
117
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 .

Swati
quelle
147
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       │
└──────────────────┴────────┴───────────┴───────┴────────────────┘
jezrael
quelle
732

copy2(src,dst)ist oft nützlicher als copyfile(src,dst)weil:

  • 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
unmontiert
quelle
19
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:

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Funktionserhalt unterstützt unterstützt Kopien anderer
                      Berechtigungsverzeichnis dest. Datei obj Metadaten  
――――――――――――――――――――――――――――――――――――――――――――――――――― ――――――――――――――――――――――――――――――
shutil.copy               ✔ ✔ ☐ ☐
 shutil.copy2              ✔ ✔ ☐ ✔
 shutil.copyfile           ☐ ☐ ☐ ☐
 shutil.copyfileobj        ☐ ☐ ✔ ☐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Beispiel:

import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')
maxschlepzig
quelle
10
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.
Maxschlepzig
3
Wie unterscheidet sich das von anderen Antworten vor 2 Jahren? stackoverflow.com/a/30359308/674039
wim
1
@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.
wim
104

In Python können Sie die Dateien mit kopieren


import os
import shutil
import subprocess

1) Kopieren von Dateien mit dem shutilModul

shutil.copyfile Unterschrift

shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)

# example    
shutil.copyfile('source.txt', 'destination.txt')

shutil.copy Unterschrift

shutil.copy(src_file, dest_file, *, follow_symlinks=True)

# example
shutil.copy('source.txt', 'destination.txt')

shutil.copy2 Unterschrift

shutil.copy2(src_file, dest_file, *, follow_symlinks=True)

# example
shutil.copy2('source.txt', 'destination.txt')  

shutil.copyfileobj Unterschrift

shutil.copyfileobj(src_file_object, dest_file_object[, length])

# example
file_src = 'source.txt'  
f_src = open(file_src, 'rb')

file_dest = 'destination.txt'  
f_dest = open(file_dest, 'wb')

shutil.copyfileobj(f_src, f_dest)  

2) Kopieren von Dateien mit dem osModul

os.popen Unterschrift

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')

os.system Unterschrift

os.system(command)


# In Linux/Unix
os.system('cp source.txt destination.txt')  

# In Windows
os.system('copy source.txt destination.txt')

3) Kopieren von Dateien mit dem subprocessModul

subprocess.call Unterschrift

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 Unterschrift

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)

kmario23
quelle
9
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.
    """
    while True:
        copy_buffer = source.read(buffer_size)
        if not 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)
Pi.
quelle
25
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')
user1016274
69

Verwenden Sie das Shutil-Modul .

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. 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.

Airsource Ltd.
quelle
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:

http://timgolden.me.uk/python/win32_how_do_i/copy-a-file.html

import os
import shutil
import tempfile

filename1 = tempfile.mktemp (".txt")
open (filename1, "w").close ()
filename2 = filename1 + ".copy"
print filename1, "=>", filename2

shutil.copy (filename1, filename2)

if os.path.isfile (filename2): print "Success"

dirname1 = tempfile.mktemp (".dir")
os.mkdir (dirname1)
dirname2 = dirname1 + ".copy"
print dirname1, "=>", dirname2

shutil.copytree (dirname1, dirname2)

if os.path.isdir (dirname2): print "Success"
Noam Manos
quelle
24

Zunächst habe ich ein ausführliches Cheatsheet mit Shutil-Methoden als Referenz erstellt.

shutil_methods =
{'copy':['shutil.copyfileobj',
          'shutil.copyfile',
          'shutil.copymode',
          'shutil.copystat',
          'shutil.copy',
          'shutil.copy2',
          'shutil.copytree',],
 'move':['shutil.rmtree',
         'shutil.move',],
 'exception': ['exception shutil.SameFileError',
                 'exception shutil.Error'],
 'others':['shutil.disk_usage',
             'shutil.chown',
             'shutil.which',
             'shutil.ignore_patterns',]
}

Zweitens erklären Sie die Kopiermethoden in Beispielen:

  1. shutil.copyfileobj(fsrc, fdst[, length]) geöffnete Objekte manipulieren
In [3]: src = '~/Documents/Head+First+SQL.pdf'
In [4]: dst = '~/desktop'
In [5]: shutil.copyfileobj(src, dst)
AttributeError: 'str' object has no attribute 'read'
#copy the file object
In [7]: with open(src, 'rb') as f1,open(os.path.join(dst,'test.pdf'), 'wb') as f2:
    ...:      shutil.copyfileobj(f1, f2)
In [8]: os.stat(os.path.join(dst,'test.pdf'))
Out[8]: os.stat_result(st_mode=33188, st_ino=8598319475, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067347, st_mtime=1516067335, st_ctime=1516067345)
  1. shutil.copyfile(src, dst, *, follow_symlinks=True) Kopieren und umbenennen
In [9]: shutil.copyfile(src, dst)
IsADirectoryError: [Errno 21] Is a directory: ~/desktop'
#so dst should be a filename instead of a directory name
  1. shutil.copy() Kopieren, ohne die Metadaten vorab zu speichern
In [10]: shutil.copy(src, dst)
Out[10]: ~/desktop/Head+First+SQL.pdf'
#check their metadata
In [25]: os.stat(src)
Out[25]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066425, st_mtime=1493698739, st_ctime=1514871215)
In [26]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[26]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516066427, st_mtime=1516066425, st_ctime=1516066425)
# st_atime,st_mtime,st_ctime changed
  1. shutil.copy2() Kopieren Sie mit dem Vorbereiten der Metadaten
In [30]: shutil.copy2(src, dst)
Out[30]: ~/desktop/Head+First+SQL.pdf'
In [31]: os.stat(src)
Out[31]: os.stat_result(st_mode=33188, st_ino=597749, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067055, st_mtime=1493698739, st_ctime=1514871215)
In [32]: os.stat(os.path.join(dst, 'Head+First+SQL.pdf'))
Out[32]: os.stat_result(st_mode=33188, st_ino=8598313736, st_dev=16777220, st_nlink=1, st_uid=501, st_gid=20, st_size=13507926, st_atime=1516067063, st_mtime=1493698739, st_ctime=1516067055)
# Preseved st_mtime
  1. shutil.copytree()

Kopieren Sie rekursiv einen gesamten Verzeichnisbaum, der auf src verwurzelt ist, und geben Sie das Zielverzeichnis zurück

Infinitesimalrechnung
quelle
1
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.

gelb01
quelle
3
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 eine reine Linux-Lösung

Kennzeichen
quelle
10
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[:]
ytpillai
quelle
2
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.
besitzt
1
Betrachten Sie die Quelle - Writelines ruft write auf, hg.python.org/cpython/file/c6880edaf6f3/Modules/_io/bytesio.c . Außerdem ist der Dateistream bereits geöffnet, sodass das Schreiben ihn nicht jedes Mal neu öffnen muss.
besitzt
2
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)
Tieftauchgang
quelle
10
Das hängt von der Plattform ab, also würde ich es nicht benutzen.
Kevin Meier
5
Ein solches callist unsicher. Bitte beachten Sie das dazugehörige Dokument.
Buhtz
2
Dies ist nicht portabel und unnötig, da Sie nur shutil verwenden können.
Corey Goldberg
2
Hmm warum dann Python?
Baris Demiray
Vielleicht erkennen Sie das Betriebssystem vor dem Start (ob es DOS oder Unix ist, weil dies die beiden am häufigsten verwendeten sind)
MilkyWay90
8

Ab Python 3.5 können Sie für kleine Dateien (z. B. Textdateien, kleine JPEGs) Folgendes tun:

from pathlib import Path

source = Path('../path/to/my/file.txt')
destination = Path('../path/where/i/want/to/store/it.txt')
destination.write_bytes(source.read_bytes())

write_bytes überschreibt alles, was sich am Zielort befand

Marc
quelle
2
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.
Jean-François Fabre
6
open(destination, 'wb').write(open(source, 'rb').read())

Öffnen Sie die Quelldatei im Lesemodus und schreiben Sie im Schreibmodus in die Zieldatei.

S471
quelle
1
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).
S471
1
Gleicher suboptimaler Ansatz zur Speicherverschwendung wie die Antwort von yellow01 .
Maxschlepzig
-3

Python bietet integrierte Funktionen zum einfachen Kopieren von Dateien mit den Betriebssystem-Shell-Dienstprogrammen.

Der folgende Befehl wird zum Kopieren der Datei verwendet

shutil.copy(src,dst)

Der folgende Befehl wird verwendet, um eine Datei mit MetaData-Informationen zu kopieren

shutil.copystat(src,dst)
Savai Maheshwari
quelle
Sie sollten copydann ausführen copystat, um Dateimetadaten beizubehalten. In Python 3.3+ werden copystatauch erweiterte Attribute kopiert.
Ingyhere