Frage

Wie kopiere ich eine Datei in Python?

Ich konnte nichts finden Sie unter os .

War es hilfreich?

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 von src 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


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

Wie @maxschlepzig unten in den Kommentaren erwähnt, ist dies für Anwendungen, die nicht optimal ist, wo die Datei zu groß ist oder wenn der Speicher ist von entscheidender Bedeutung, so dass

Zum einen habe ich eine erschöpfende Spickzettel von shutil Methoden für Ihre Referenz.

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 Methoden der Kopie in exmaples:

  
      
  1. shutil.copyfileobj(fsrc, fdst[, length]) manipulieren Objekte geöffnet
  2.   
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
  2.   
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 preseving die Metadaten
  2.   
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 mit preseving die Metadaten
  2.   
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 ()` `
  2.   

Recursively einen ganzen Verzeichnisbaum in src verwurzelt kopieren, zurückkehr das Zielverzeichnis

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top