Antworten:
shutil
hat viele Methoden, die Sie verwenden können. Eines davon ist:
from shutil import copyfile
copyfile(src, dst)
Wenn Sie os.path
Operationen verwenden, verwenden Sie copy
statt copyfile
. copyfile
wird nur Strings akzeptieren .
~
, aber relative Pfade verarbeiten kann
┌──────────────────┬────────┬───────────┬───────┬────────────────┐
│ 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 │
└──────────────────┴────────┴───────────┴───────┴────────────────┘
copy2(src,dst)
ist oft nützlicher als copyfile(src,dst)
weil:
dst
ein Verzeichnis sein (anstelle des vollständigen Zieldateinamens). In diesem Fall wird der Basisname von src
zum Erstellen der neuen Datei verwendet.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
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 ein IsADirectoryError
, andernfalls kopiert es die Datei /new/dir/
unter dem ursprünglichen Namen.
Sie können eine der Kopierfunktionen aus dem shutil
Paket 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')
In Python können Sie die Dateien mit kopieren
shutil
Modulos
Modulsubprocess
Modulimport os
import shutil
import subprocess
shutil
Modulshutil.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)
os
Modulos.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')
subprocess
Modulsubprocess.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)
['copy', sourcefile, destfile]
Syntax, insbesondere wenn die Parameter von Benutzereingaben stammen.
os.popen
ist jetzt schon eine Weile veraltet. und check_output
gibt nicht den Status zurück, sondern die Ausgabe (die im Fall von leer ist copy/cp
)
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)
shutil.copyfileobj
. Außerdem müssen Sie try, 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, wie shutil.copyfile
Wraps shutil.copyfileobj
.
dest
sein:open(dest, 'wb')
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.
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"
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:
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)
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
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
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
shutil.copytree()
Kopieren Sie rekursiv einen gesamten Verzeichnisbaum, der auf src verwurzelt ist, und geben Sie das Zielverzeichnis zurück
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.
.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, 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.
Du könntest benutzen os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')
oder wie ich es getan habe,
os.system('cp '+ rawfile + ' rawdata.dat')
Wo rawfile
ist der Name, den ich im Programm generiert hatte?
Dies ist eine reine Linux-Lösung
shutil
es nicht verfügbar ist - subprocess.run()
(ohne shell=True
!) Ist die bessere Alternative zu os.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 wird shutil
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.
for line in open("file.txt", "r"):
list.append(line)
if len(list) == 1000000:
output.writelines(list)
del list[:]
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 n
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 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.
from subprocess import call
call("cp -p <file> <file>", shell=True)
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:
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
shutil
behandelt alle Sonderfälle für Sie und gibt Ihnen Sicherheit.
open(destination, 'wb').write(open(source, 'rb').read())
Öffnen Sie die Quelldatei im Lesemodus und schreiben Sie im Schreibmodus in die Zieldatei.
.close()
bei all diesen open(...)
?
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)
copy
dann ausführen copystat
, um Dateimetadaten beizubehalten. In Python 3.3+ werden copystat
auch erweiterte Attribute kopiert.