3776 Stimmen

Wie kopiert man Dateien?

Wie kann ich eine Datei in Python kopieren?

108voto

pi. Punkte 20053

Das Kopieren einer Datei ist ein relativ unkomplizierter Vorgang, wie die folgenden Beispiele zeigen, aber Sie sollten stattdessen die Funktion 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 nach Dateinamen kopieren wollen, können Sie so vorgehen:

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)

25 Stimmen

Mir ist vor einiger Zeit aufgefallen, dass das Modul shutil (Singular) und nicht shutils (Plural) heißt, und tatsächlich heißt es es in Python 2.3. Trotzdem lasse ich diese Funktion hier als Beispiel stehen.

86voto

Airsource Ltd Punkte 31802

Verwenden Sie die Shutil-Modul .

copyfile(src, dst)

Kopieren Sie den Inhalt der Datei mit dem Namen src in eine Datei mit dem Namen dst. Der Zielspeicherort muss beschreibbar sein; andernfalls wird eine IOError-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. src und dst sind Pfadnamen, die als Zeichenketten angegeben werden.

Werfen Sie einen Blick auf filesys für alle Funktionen zur Datei- und Verzeichnisbehandlung, die in Standard-Python-Modulen verfügbar sind.

50voto

Noam Manos Punkte 12442

Beispiel für das Kopieren von Verzeichnissen und Dateien - Aus Tim Golden's Python Stuff:

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"

43voto

fabda01 Punkte 2755

Für kleine Dateien und wenn Sie nur Python-Built-Ins verwenden, können Sie den folgenden Einzeiler verwenden:

with open(source, 'rb') as src, open(dest, 'wb') as dst: dst.write(src.read())

Dies ist nicht der optimale Weg für Anwendungen, bei denen die Datei zu groß ist oder wenn der Speicherplatz kritisch ist, also Swati's Die Antwort sollte bevorzugt werden.

33voto

AbstProcDo Punkte 17041

Zunächst habe ich einen umfassenden Spickzettel mit den Shil-Methoden zu Ihrer Information 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: Erläutern Sie die Kopiermethoden anhand von 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 Vorlesen der Metadaten
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() Kopie mit Vorwahl 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()

Rekursives Kopieren eines gesamten Verzeichnisbaums, der in src verwurzelt ist, mit Rückgabe des Zielverzeichnisses

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