Wie kann ich eine Datei in Python kopieren?
-
02-07-2019 - |
Frage
Wie kopiere ich eine Datei in Python?
Ich konnte nichts finden Sie unter os
.
Lösung
shutil
viele Methoden hat 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 namens dst
. Der Zielort muss beschreibbar sein; andernfalls wird eine IOError
Ausnahme ausgelöst werden. Wenn dst
bereits vorhanden ist, wird es ersetzt. Spezielle Dateien wie Zeichen- oder Blockgeräten und Rohrleitungen können mit dieser Funktion nicht kopiert werden. src
und dst
sind Pfadnamen als Strings angegeben.
Andere Tipps
┌──────────────────┬───────────────┬──────────────────┬──────────────┬───────────┐
│ Function │Copies metadata│Copies permissions│Can use buffer│Dest dir OK│
├──────────────────┼───────────────┼──────────────────┼──────────────┼───────────┤
│shutil.copy │ No │ Yes │ No │ Yes │
│shutil.copyfile │ No │ No │ No │ No │
│shutil.copy2 │ Yes │ Yes │ No │ Yes │
│shutil.copyfileobj│ No │ No │ Yes │ No │
└──────────────────┴───────────────┴──────────────────┴──────────────┴───────────┘
copy2(src,dst)
ist oft nützlicher als copyfile(src,dst)
weil:
- es erlaubt
dst
ein Verzeichnis (statt des gesamten Zieldateinamen), wobei in diesem Fall des base vonsrc
ist für die Erstellung der neuen Datei verwendet wird; - es bewahrt die ursprüngliche Änderungs- und Zugriffs info (mtime und atime) in den Metadaten der Datei (aber das kommt mit einem leichten Overhead).
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
Sie können eine der Kopierfunktionen verwenden, um von dem shutil
Paket:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Function preserves supports accepts copies other permissions directory dest. file obj metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― shutil.copy ✔ ✔ ☐ ☐ shutil.copy2 ✔ ✔ ☐ ✔ shutil.copyfile ☐ ☐ ☐ ☐ shutil.copyfileobj ☐ ☐ ✔ ☐ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Beispiel:
import shutil
shutil.copy('/etc/hostname', '/var/tmp/testhostname')
Das Kopieren einer Datei ist ein relativ einfacher Vorgang wie durch die folgenden Beispiele gezeigt, aber Sie sollten stattdessen die shutil stdlib Modul dafür.
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 mit dem Dateinamen kopieren wollen Sie so etwas tun könnte:
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)
In Python können Sie die Dateien kopieren Sie mit
-
shutil
Modul -
os
Modul -
subprocess
Modul
import os
import shutil
import subprocess
1) Das Kopieren von Dateien mit shutil
Modul
shutil.copyfile
Signatur
shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copyfile('source.txt', 'destination.txt')
shutil.copy
Signatur
shutil.copy(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy('source.txt', 'destination.txt')
shutil.copy2
Signatur
shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
# example
shutil.copy2('source.txt', 'destination.txt')
shutil.copyfileobj
Signatur
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) Das Kopieren von Dateien mit os
Modul
os.popen
Signatur
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
Signatur
os.system(command)
# In Linux/Unix
os.system('cp source.txt destination.txt')
# In Windows
os.system('copy source.txt destination.txt')
3) Das Kopieren von Dateien mit subprocess
Modul
subprocess.call
Signatur
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
Signatur
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)
Mit dem shutil Modul .
copyfile(src, dst)
Kopieren Sie den Inhalt der Datei mit dem Namen src in eine Datei namens 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äten und Rohrleitungen können mit dieser Funktion nicht kopiert werden. src und dst sind Pfadnamen als Strings angegeben.
Hier finden Sie aktuelle filesys für die alle Datei- und Verzeichnis-Handling-Funktionen verfügbar in Standard-Python-Modulen.
Verzeichnis- und Dateikopier Beispiel - Von Tim Goldens Python Stuff:
http://timgolden.me.uk/python/win32_how_do_i/ Kopie-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"
Sie könnten verwenden os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
oder, wie ich es tat,
os.system('cp '+ rawfile + ' rawdata.dat')
wo rawfile
ist der Name, den ich im Programm erzeugt hatte.
Dies ist eine Linux einzige Lösung
Für kleine Dateien und nur mit Python eingebaute Funktionen, können Sie die folgenden Einzeiler verwenden:
with open(source, 'r') as src, open(dest, 'w') as dst: dst.write(src.read())
Für große Dateien, was ich habe die Datei Zeile für Zeile gelesen wurde und jede Zeile in ein Array lesen. Dann, wenn das Array eine bestimmte Größe erreicht, hängen Sie sie in eine neue Datei.
for line in open("file.txt", "r"):
list.append(line)
if len(list) == 1000000:
output.writelines(list)
del list[:]
from subprocess import call
call("cp -p <file> <file>", shell=True)
Wie von Python 3.5 Sie tun können die folgend für kleine Dateien (zB: Textdateien, kleine JPEG-Dateien):
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
wird überschrieben, was am Zielort Lage war
open(destination, 'wb').write(open(source, 'rb').read())
Öffnen Sie die Quelldatei im Lesemodus und schreiben, um Zieldatei im Schreibmodus.
Python bietet in-integrierte Funktionen für die einfache Kopieren von Dateien des Betriebssystem-Shell-Dienstprogramme verwenden.
Nach dem Befehl wird verwendet, Datei zu kopieren
shutil.copy(src,dst)
Nach dem Befehl wird verwendet, Datei mit Metadaten kopieren
shutil.copystat(src,dst)