C贸mo copiar un archivo en Python

    Introducci贸n

    Cuando se trata de usar Python para copiar archivos, hay dos formas principales: usar el shutil m贸dulo o el os m贸dulo. Toda la os Los m茅todos que mostramos aqu铆 son m茅todos que nos permiten ejecutar comandos de shell desde nuestro c贸digo Python, que usaremos para ejecutar el copy comando (Windows) o el cp comando (Unix).

    Notar谩s que muchos de estos m茅todos, tanto en shutil m贸dulo y el os m贸dulo, tienen una funcionalidad muy similar (lo que no deber铆a sorprender), pero cada uno var铆a en funcionalidad entre s铆 muy ligeramente, lo que tambi茅n explicar茅.

    Copiar archivos con el m贸dulo shutil

    los m贸dulo shutil ofrece varios m茅todos de alto nivel para copiar archivos. A continuaci贸n se muestran los principales:

    copiar archivo

    Este m茅todo copia el contenido de un archivo en otro archivo. El destino que se le proporcione debe ser un archivo grabable y tener un nombre diferente al del archivo de origen. Si los nombres son los mismos, generar谩 un error. Si el archivo de destino ya existe, ser谩 reemplazado por el archivo reci茅n copiado.

    La sintaxis de este m茅todo es:

    shutil.copyfile(src_file, dest_file, *, follow_symlinks=True)
    

    Por ejemplo, el siguiente c贸digo copiar谩 un archivo llamado “file1.txt” en un archivo llamado “file2.txt”:

    import shutil
    
    shutil.copyfile('file1.txt', 'file2.txt')
    

    Una caracter铆stica interesante y potencialmente 煤til de shutil.copyfile es el follow_symlinks Argumento booleano. Si est谩 configurado en False, y el archivo de origen es un enlace simb贸lico, en lugar de copiar el archivo, se crear谩 un nuevo enlace simb贸lico.

    Copiar

    Este m茅todo es muy similar a copyfile, con la principal diferencia de que adem谩s de copiar el contenido del archivo fuente, va un paso m谩s all谩 y tambi茅n copia los permisos del sistema de archivos del archivo. Copiar permisos de archivos no es una tarea trivial en la mayor铆a de los lenguajes de programaci贸n, por lo que esta es una buena caracter铆stica.

    La sintaxis es la siguiente:

    shutil.copy(src_file, dest_file, *, follow_symlinks=True)
    

    Cada uno de estos par谩metros es el mismo que en el copyfile m茅todo. Por ejemplo, el siguiente c贸digo copiar谩 “file1.txt” en “file3.txt”.

    import shutil
    
    shutil.copy('file1.txt', 'file3.txt')
    

    Nota: Aseg煤rese de no nombrar su script con el mismo nombre que uno de los m贸dulos que est谩 importando (lo que hice por error al probar el c贸digo de este art铆culo). Si lo hace, obtendr谩 un error al intentar importar ese m贸dulo debido a un problema de importaci贸n circular.

    copia2

    Al igual que con los m茅todos anteriores, copy2 El m茅todo es id茅ntico al copy , pero adem谩s de copiar el contenido del archivo, tambi茅n intenta conservar todos los metadatos del archivo fuente. Si la plataforma no permite el guardado completo de metadatos, entonces copy2 no devuelve fallos y solo conservar谩 los metadatos que pueda.

    La sintaxis es la siguiente:

    shutil.copy2(src_file, dest_file, *, follow_symlinks=True)
    

    Nuevamente, estos par谩metros son los mismos que en los comandos anteriores que hemos mencionado hasta ahora.

    Por ejemplo, el siguiente c贸digo copiar谩 “file1.txt” en “file4.txt” y conservar谩 los metadatos del archivo original, “file1.txt”.

    import shutil
    
    shutil.copy2('file1.txt', 'file4.txt')
    
    $ python copy-files.py 
    $ ls -l
    total 32
    -rw-r--r--  1 scott  staff  91 Oct 27 11:26 copy-files.py
    -rw-r--r--  1 scott  staff   6 Oct 27 11:27 file1.txt
    -rw-r--r--  1 scott  staff   6 Oct 27 11:29 file3.txt
    -rw-r--r--  1 scott  staff   6 Oct 27 11:27 file4.txt
    

    Como podemos ver al ejecutar nuestro c贸digo anterior, “file1.txt” se copi贸 a “file4.txt”. Sin embargo, es posible que haya notado que la fecha de creaci贸n se conserv贸 en el nuevo archivo, a diferencia de shutil.copy, que copi贸 “file1.txt” a “file3.txt” y le dio una nueva fecha de creaci贸n.

    copyfileobj

    Este m茅todo copia el contenido de un archivo de origen en un archivo de destino, desde la posici贸n actual del archivo de origen. Lo que esto significa es que si lee datos de su objeto de archivo de origen, entonces la posici贸n en la que deja de leer es la posici贸n copyfileobj comienza a copiar desde.

    La sintaxis es la siguiente:

    shutil.copyfileobj(src_file_object, dest_file_object[, length])
    

    Los significados de los par谩metros de los archivos de origen y destino son similares a los de los comandos anteriores, pero ahora se refieren a objetos. El par谩metro de longitud es opcional y representa el tama帽o del b煤fer, que es el n煤mero de bits que se mantienen en la memoria durante el proceso de copia. Esta opci贸n puede resultar 煤til al copiar archivos muy grandes, ya que puede acelerar el proceso de copia y evita el uso incontrolado de la memoria.

    Por ejemplo, el siguiente c贸digo copiar谩 “file1.txt” en “file5.txt”

    import shutil
    
    filename1 = 'file1.txt'
    fileA = open(filename1, 'rb')
    
    filename2 = 'file5.txt'
    fileB = open(filename2, 'wb')
    
    shutil.copyfileobj(fileA, fileB)
    

    Como podemos ver, para utilizar copyfileobj, necesitamos abrir los archivos en modo binario (que es la parte “b” de “rb” y “wb”). Adem谩s, el archivo de origen debe abrirse como legible y el archivo de destino debe abrirse como escribible (las partes “r” y “w”, respectivamente).

    Copiar archivos con el m贸dulo del sistema operativo

    los m贸dulo os proporciona una forma de utilizar la funcionalidad del sistema operativo para copiar sus archivos. En la mayor铆a (si no en todos) de los ejemplos de aqu铆 en adelante proporcionamos ejemplos que funcionan tanto para Windows como para Unix. Los ejemplos son diferentes debido a los comandos de shell utilizados, as铆 que aseg煤rese de prestar atenci贸n a c贸mo se etiqueta cada llamada de funci贸n en los comentarios de Python.

    popen

    Este m茅todo abre una tuber铆a hacia o desde su comando. Sin embargo, tenga en cuenta que este m茅todo qued贸 obsoleto en Python 2.6, por lo que no recomendamos usarlo a menos que sea necesario. Como alternativa, la documentaci贸n de Python nos aconseja utilizar m茅todos del m贸dulo de subproceso.

    La sintaxis es la siguiente:

    os.popen(cmd[, mode[, bufsize]])
    

    Aqu铆, el valor devuelto es un objeto de archivo que est谩 conectado a la tuber铆a. Este objeto se puede leer o escribir en funci贸n del modo. El modo predeterminado es ‘r’, que permite leer el contenido del archivo.

    El siguiente ejemplo copiar谩 “file1.txt” en “file6.txt”:

    import os
    
    # Windows
    os.popen('copy file1.txt file6.txt')
    
    # Unix
    os.popen('cp file1.txt file6.txt')
    

    Ejecutar el comando de esta manera es exactamente lo mismo que si lo ejecutara directamente desde la l铆nea de comandos de su terminal.

    sistema

    Este m茅todo ejecuta el comando especificado en una subshell. Est谩 disponible para Unix y Windows. La sintaxis es la siguiente:

    os.system(command)
    

    Aqu铆 command es una cadena que contiene el comando de shell de DOS o Unix. En nuestro caso, aqu铆 es donde pondremos el copy o cp mando.

    Por ejemplo, el siguiente c贸digo copiar谩 “file1.txt” en “file7.txt”

    import os
    
    # Windows
    os.system('copy file1.txt file7.txt')
    
    # Unix
    os.system('cp file1.txt file7.txt')
    

    Esto parece id茅ntico al anterior os.popen comando que acabamos de usar, pero el comando se ejecuta en una subcapa, lo que significa que se ejecuta en un hilo separado en paralelo a su c贸digo de ejecuci贸n. Para esperar a que se complete, debe llamar .wait() en el objeto devuelto por os.system.

    Copia de archivos con el m贸dulo de subproceso

    los m贸dulo de subproceso tiene la intenci贸n de reemplazar algunos m茅todos en el os m贸dulo (particularmente os.system y el os.spawn* m茅todos), y presenta dos m茅todos principales para acceder a los comandos del sistema operativo. Estos m茅todos son call y check_output. Una vez m谩s, para los sistemas Unix, el comando “copiar archivo1.txt archivo2.txt” debe reemplazarse por “cp archivo1.txt archivo2.txt”.

    m茅todo de llamada

    La documentaci贸n de Python nos recomienda utilizar la call m茅todo para ejecutar un comando desde el sistema operativo.

    La sintaxis es la siguiente:

    subprocess.call(args, *, stdin=None, stdout=None, stderr=None, shell=False)
    

    los args El par谩metro incluir谩 nuestro comando de shell. Sin embargo, una advertencia, ya que la documentaci贸n de Python nos advierte que usar shell=True puede ser un riesgo para la seguridad.

    Usando esta llamada de funci贸n, podemos ejecutar nuestro comando de copia de la siguiente manera:

    import subprocess
    
    # Windows
    status = subprocess.call('copy file1.txt file8.txt', shell=True)
    
    # Unix
    status = subprocess.call('cp file1.txt file8.txt', shell=True)
    

    Como muestra el ejemplo anterior, simplemente necesitamos pasar una cadena con el comando de shell, como antes.

    Y como se esperaba, el sistema operativo copiar谩 “file1.txt” en un archivo llamado “file8.txt”.

    M茅todo check_output

    Este m茅todo tambi茅n nos permite ejecutar un comando dentro de un shell. Es muy parecido al subprocess.run comando, excepto que, de forma predeterminada, canaliza datos desde stdout como bytes codificados. La sintaxis es la siguiente:

    subprocess.check_output(args, *, stdin=None, stderr=None, shell=False, universal_newlines=False)
    

    Aqu铆 el args El par谩metro incluye el comando de shell que queremos usar. Una vez m谩s, la documentaci贸n de Python nos advierte de usar shell=True, utilice este m茅todo con precauci贸n.

    En el siguiente c贸digo copiaremos “file1.txt” a “file9.txt” usando el check_output mando:

    import subprocess
    
    # Windows
    status = subprocess.check_output('copy file1.txt file9.txt', shell=True)
    
    # Unix
    status = subprocess.check_output('cp file1.txt file9.txt', shell=True)
    

    Y como con todos los comandos que hemos mostrado en este art铆culo, esto copiar谩 el archivo “file1.txt” al destino que especificamos, que es “file9.txt” aqu铆.

    Terminando

    Python nos ofrece muchas formas diferentes de copiar archivos, algunas de las cuales son parte del conjunto de m茅todos de Python. Otros usan algunos de los poderosos m茅todos de Python para ejecutar comandos en un shell, que utilizan comandos de shell como copy o cp.

    驴No est谩s seguro de cu谩l es el adecuado para ti? Presentamos muchas formas diferentes de copiar archivos aqu铆, por lo que es comprensible. El m茅todo que utilice para copiar un archivo depende completamente de usted y depender谩 de sus necesidades espec铆ficas. Aunque en la mayor铆a de los casos uno de los shutil Los comandos funcionar谩n bien para usted. Intenta comenzar con shutil.copy2 y vea si eso hace lo que necesita.

    驴Qu茅 m茅todo usas y por qu茅? 隆H谩znoslo saber en los comentarios!

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *