Operaciones con ficheros y directorios utilizando Python

En un tutorial anterior, discutimos sobre cómo leer, abrir, cerrar y escribir en archivos con Python. En este artículo, iremos un poco más lejos y veremos distintas operaciones que puedes realizar en ficheros y directorios.

Ya sabes que en esto de la programación solemos trabajar con muchísimos ficheros, y que nuestro trabajo va más allá de abrirlos y cerrarlos. ¿Cuántas veces habrás copiado un fichero específico? O, ¿cuántas veces te has descargado un archivo de un sitio web, te has dado cuenta que el nombre no tenía sentido alguno y los has cambiado? En este artículo debatiremos sobre este tipo de operaciones.

¿Todo claro? Pues eso, vamos a ver lgunas funciones interesantes que podemos realizar en nuestros ficheros y directorios con Python.

Shutil

shutil (Shell Utilities) es el nombre del módulo que utilizaremos en este tutorial para llevar a cabo diferentes operaciones con archivos y directorios. Shutil viene por defecto con tu instalación de Pyhton, por lo que no necesitas instalarla manualmente. Para hacer uso de este módulo, todo lo que es necesitas hacer es hacer import del propio módulo:

import shutil

Copiar ficheros

Vamos a empezar con nuestra primera operación, copiar ficheros. Para eso, vamos a utilizar la función copy() del módulo que hemos importado antes, shutil. Voy a utilizar el fichero sample.pdf para este tutorial, así que si quieres seguirlo al pie de la letra, puedes descargarlo.

El siguiente script te mostrará cómo copiar el fichero sample.pdf del escritorio (donde esta fisicamente localizado) a otro directorio llamado Temp, que también esta localizado en el directorio:

import shutil
shutil.copy('sample.pdf', 'Temp')

Date cuenta que solo nombro el nombre del archivo y el nombre del directorio, ya que estoy trabajando con mi terminal en local, localizado en el escritorio. Puedes especificar también la ruta completa del fichero y del directorio hacia donde quieres copiar el archivo, en mi caso sería así:

shutil.copy('/Users/Abder/Desktop/sample.pdf', '/Users/Abder/Desktop/Temp')

Abre el directorio Temp, o cualquier directorio que hayas especificado y asegúrate de que el fichero se ha copiado correctamente.

¿Qué pasaría si el segundo parámetro pasado a la función copy() fuese un archivo en lugar de un directorio? En otras palabras, digamos que has escrito lo siguiente (he quitado las rutas completas a los archivos, suponiendo que estamos trabajando desde el escritorio)

import shutil
shutil.copy('sample.pdf', 'file.pdf')

Si todo ha salido bien, tendrás un nuevo fichero llamado file.pdf, que será una copia exacta del fichero original sample.pdf. Es decir, si abres file.pdf, verás que tienen el mismo contenido debido a que es una copia del fichero sample.pdf.

¿Pueden ser el origen y el destino lo mismo? Vamos a echar un vistazo.

shutil.copy('sample.pdf', 'sample.pdf')

Esta operación, lógicamente, nos reportará un error debido a que los nombres de fichero no pueden ser los mismos.

Traceback (most recent call last):
  File "test.py", line 2, in 
    shutil.copy('sample.pdf', 'sample.pdf')
  File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 119, in copy
    copyfile(src, dst)
  File "/usr/local/Cellar/python/2.7.10_2/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shutil.py", line 69, in copyfile
    raise Error("`%s` and `%s` are the same file" % (src, dst))
shutil.Error: `sample.pdf` and `sample.pdf` are the same file

Copiando directorios

En esta sección, vamos a ver como podemos copiar un directorio completo en lugar de un solo fichero, como hemos visto en la anterior sección.

Supongamos que tenemos la siguiente estructura de directorios, los cuales quieres copiar. Es decir, tenemos el directorio principal llamado Original, y dentro de él una serie de directorios en orden jerárquico llamados Original-1, Original-2 y Original-3. Dentro del último directorio se encuentra nuestro fichero de ejemplo, el sample.pdf. Lo comprenderás mejor así:

Original
   |- Original-1
      |- Original-2
         |- Original-3
            |- sample.pdf

Lo que queremos hacer ahora es copiar el directorio Original con todos sus contenidos a un nuevo directorio, y a este nuevo directorio lo llamaremos Original-copy.

Esto se puede realizar fácilmente utilizando la función copytree() tal que así (asumiendo otra vez que todo lo estás ejecutando desde el escritorio)

import shutil
shutil.copytree('Original', 'Original-Copy')

Si todo ha salido bien, encontrarás un nuevo directorio Original-copy con todos los contenidos y estructura de Original.

Mover ficheros

Mover un fichero es como cuando hacemos una operación de cortar en nuestro sistema operativo. En la sección Copiar ficheros, hemos visto como hacer una copia del fichero, siempre manteniendo el archivo original en su ubicación original.

En esta sección, veremos como mover (cortar) el fichero a un nuevo destino, eliminando el fichero de su ubicación original. Esta operación se puede llevar a cabo utilizando la función move() tal que así:

import shutil
shutil.move('Sample.pdf', 'Temp')

Percátate de que el fichero sample.pdf ya no existe en el escritorio y ahora se encuentra en el directorio Temp.

¿Qué pasa si movemos sample.pdf a un nuevo archivo llamado new-sample.pdf tal que así?

import shutil
shutil.move('Sample.pdf', 'New-Sample.pdf')

En este caso, solo tendrás el archivo New-Sample.pdf con el mismo contenido que sample.pdf, pero sample.pdf ya no existirá nunca más.

Moviendo directorios

Para mover directorios utilizaremos la misma función que para mover archivos, es decir, la función move() Vamos a utilizar el mismo ejemplo que en la sección Copiar directorios, pero ahora con la función move()

import shutil
shutil.move('Original', 'Original-Copy')

En este caso, tendrás un nuevo directorio Original.Copy con el mismo contenido que Original, pero Original ya no existirá nunca más.

Eliminar archivos y directorios

El módulo shutil no contiene una función para eliminar archivos. Lo hace, sin embargo, mediante una función para borrar directorios: rmtree(). Ten cuidado porque la eliminación es permanente, y por lo tanto, no encontrarás el directorio eliminado en la Papelera.

El siguiente ejemplo muestra cómo podemos eliminar permanentemente el directorio Original-Copy:

import shutil
shutil.rmtree('Original-Copy')

Si quieres elminar permanentemente un fichero, puedes utilizar la función remove() del módulo os de Python, tal que así:

import os
os.remove('Sample.pdf')

Fuente: Abder-Rahman Ali

COMPARTE ESTE ARTÍCULO

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP