¿Cómo copio un archivo en Python?


¿Cómo copio un archivo en Python? No pude encontrar nada debajo del sistema os .


Answers



shutil tiene muchos métodos que puedes usar. Uno de los cuales es:

from shutil import copyfile

copyfile(src, dst)

Copie los contenidos del archivo llamado src a un archivo llamado dst . La ubicación de destino debe poder escribirse; de lo contrario, se generará una excepción IOError . Si dst ya existe, será reemplazado. Los archivos especiales como los dispositivos de caracteres o bloques y las tuberías no se pueden copiar con esta función. src y dst son nombres de ruta dados como cadenas.




copy2(src,dst) suele ser más útil que copyfile(src,dst) porque:

  • permite que dst sea ​​un directorio (en lugar del nombre de archivo de destino completo), en cuyo caso el nombre base de src se usa para crear el nuevo archivo;
  • conserva la modificación original y la información de acceso (mtime y atime) en los metadatos del archivo (sin embargo, esto viene con una ligera sobrecarga).

Aquí hay un pequeño ejemplo:

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



-------------------------------------------------------------------------
| Function          |Copies Metadata|Copies Permissions|Can Specify Buffer|
-------------------------------------------------------------------------
| shutil.copy       |      No       |        Yes       |        No        |
-------------------------------------------------------------------------
| shutil.copyfile   |      No       |         No       |        No        |
-------------------------------------------------------------------------
| shutil.copy2      |     Yes       |        Yes       |        No        |
-------------------------------------------------------------------------
| shutil.copyfileobj|      No       |         No       |       Yes        |
-------------------------------------------------------------------------



Copiar un archivo es una operación relativamente sencilla como se muestra en los ejemplos a continuación, pero en su lugar debe usar el módulo shutil stdlib para eso.

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 1:
        copy_buffer = source.read(buffer_size)
        if not copy_buffer:
            break
        dest.write(copy_buffer)

Si quiere copiar por nombre de archivo puede hacer algo como esto:

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)



Use el módulo shutil .

copyfile(src, dst)

Copie los contenidos del archivo llamado src a un archivo llamado dst. La ubicación de destino debe poder escribirse; de lo contrario, se generará una excepción IOError. Si dst ya existe, será reemplazado. Los archivos especiales como los dispositivos de caracteres o bloques y las tuberías no se pueden copiar con esta función. src y dst son nombres de ruta dados como cadenas.

Eche un vistazo a filesys para ver todas las funciones de manejo de archivos y directorios disponibles en los módulos estándar de Python.




Ejemplo de copia de directorio y archivo: de 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"



Mira el módulo shutil . Contiene el archivo de copia de la función ( src , dst )




Puede usar una de las funciones de copia del paquete shutil :

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Function              preserves     supports          accepts     copies other
                      permissions   directory dest.   file obj    metadata  
――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――
shutil.copy              ✔             ✔                 ☐           ☐
shutil.copy2             ✔             ✔                 ☐           ✔
shutil.copyfile          ☐             ☐                 ☐           ☐
shutil.copyfileobj       ☐             ☐                 ✔           ☐
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

Ejemplo:

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



Puede usar os.system('cp nameoffilegeneratedbyprogram /otherdirectory/')

o como lo hice,

os.system('cp '+ rawfile + ' rawdata.dat')

donde rawfile es el nombre que había generado dentro del programa.

Esta es una solución única de Linux




Para archivos grandes, lo que hice fue leer el archivo línea por línea y leer cada línea en una matriz. Luego, una vez que la matriz alcance cierto tamaño, agréguela a un nuevo archivo.

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)



Sugiero usar la respuesta de Swati , pero supongamos que tiene un archivo de texto y no quiere usar bibliotecas adicionales en su código solo para copiarlo, puede usar el siguiente uni- liner:

with open(source, 'r') as src, open(dest, 'w') as dst: dst.write(src.read())