3776 Stimmen

Wie kopiert man Dateien?

Wie kann ich eine Datei in Python kopieren?

4640voto

Swati Punkte 45171

shutil hat viele Methoden, die Sie verwenden können. Eine davon ist:

import shutil

shutil.copyfile(src, dst)

# 2nd option
shutil.copy(src, dst)  # dst can be a folder; use shutil.copy2() to preserve timestamp
  • Kopieren Sie den Inhalt der Datei mit dem Namen src in eine Datei namens dst . Beide src y dst muss der gesamte Dateiname der Dateien, einschließlich des Pfads, angegeben werden.
  • Der Zielort muss beschreibbar sein; andernfalls wird ein IOError wird eine Ausnahme ausgelöst.
  • Wenn dst bereits existiert, wird sie ersetzt.
  • Spezielle Dateien wie Zeichen- oder Blockgeräte und Pipes können mit dieser Funktion nicht kopiert werden.
  • Con copy , src y dst sind Pfadnamen, die als str s.

Eine weitere shutil zu betrachtende Methode ist shutil.copy2() . Es ist ähnlich, behält aber mehr Metadaten bei (z. B. Zeitstempel).

Wenn Sie os.path Operationen, verwenden copy statt copyfile . copyfile akzeptiert nur Zeichenketten.

58 Stimmen

Beachten Sie, dass je nach Plattform nicht alle Metadaten kopiert werden.

23 Stimmen

Beachten Sie, dass es sich nicht um eine atomare Operation handelt. Seien Sie vorsichtig, wenn Sie sie in einer Anwendung mit Threads verwenden.

10 Stimmen

Beachten Sie, dass es nicht mit Abkürzungen wie ~ aber es kann mit relativen Pfaden umgehen

2103voto

jezrael Punkte 716156

Funktion

Kopien
Metadaten

Kopien
Berechtigungen

Verwendet Dateiobjekt

Reiseziel
kann Verzeichnis sein

shutil.copy

No

Ja

No

Ja

shutil.copyfile

No

No

No

No

shutil.copy2

Ja

Ja

No

Ja

shutil.copyfileobj

No

No

Ja

No

13 Stimmen

24 Stimmen

Was für ein Chaos! Wer hat diese APIs entworfen :-\

0 Stimmen

Ich habe copy und copy2 verwendet. Aber es wird ein Fehler ausgegeben: Ist ein Verzeichnis: 'xxxx'

972voto

unmounted Punkte 31968

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

  • es ermöglicht dst zu sein Verzeichnis (anstelle des vollständigen Zieldateinamens), in diesem Fall wird die basename de src wird für die Erstellung der neuen Datei verwendet;
  • werden die ursprünglichen Änderungs- und Zugriffsinformationen (mtime und atime) in den Metadaten der Datei beibehalten (was allerdings mit einem leichten Overhead verbunden ist).

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

51 Stimmen

Ich versuche, zufällig 100k Dateien aus 1 Million Dateien zu kopieren. copyfile ist erheblich schneller als copy2

0 Stimmen

Beachten Sie, dass shutil.copy auch erlaubt dest ein Verzeichnis zu sein, zumindest in den aktuellen Versionen (ich verwende Python 3.8)

274voto

kmario23 Punkte 49380

In Python können Sie die Dateien mit


import os
import shutil
import subprocess

1) Kopieren von Dateien mit shutil Modul

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 os Modul

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 subprocess Modul

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)

13 Stimmen

Die Verwendung von Single-String-Befehlen ist ein schlechter Programmierstil (Flexibilität, Zuverlässigkeit und Sicherheit), verwenden Sie stattdessen ['copy', sourcefile, destfile] Syntax, wo immer dies möglich ist, insbesondere wenn die Parameter aus Benutzereingaben stammen.

16 Stimmen

Warum führen Sie so viele schlechte Alternativen zu den shutil-Kopierfunktionen auf?

18 Stimmen

Shutil ist eingebaut, es besteht keine Notwendigkeit, nicht-portable Alternativen anzubieten. Die Antwort könnte tatsächlich verbessert werden, indem die systemabhängigen Lösungen entfernt werden, und nach dieser Entfernung ist diese Antwort nur eine Kopie der bestehenden Antworten / eine Kopie der Dokumentation.

187voto

maxschlepzig Punkte 31061

Sie können eine der Kopierfunktionen aus der shutil Paket:

Function              preserves     supports          accepts     copies other
                      permissions   directory dest.   file obj    metadata  

[shutil.copy](https://docs.python.org/3/library/shutil.html#shutil.copy)                                                       
[shutil.copy2](https://docs.python.org/3/library/shutil.html#shutil.copy2)                                                      
[shutil.copyfile](https://docs.python.org/3/library/shutil.html#shutil.copyfile)                                                   
[shutil.copyfileobj](https://docs.python.org/3/library/shutil.html#shutil.copyfileobj)                                                

Beispiel:

import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X