Lectura y escritura de archivos en Python

Una vez que te sientas cómodo trabajando con carpetas y rutas relativas, podrás especificar la ubicación de los archivos a leer y escribir. Las funciones se aplicarán a los archivos de texto plano. Los archivos de texto plano sólo contienen caracteres de texto básicos y no incluyen información sobre la fuente, el tamaño o el color. Los archivos de texto con la extensión .txt o los archivos de script de Python con la extensión .py son ejemplos de archivos de texto plano. Pueden abrirse con el Bloc de notas de Windows o la aplicación TextEdit de macOS. Tus programas pueden leer fácilmente el contenido de los archivos de texto plano y tratarlo como un valor de cadena ordinario.

Los archivos binarios son todos los demás tipos de archivos, como documentos de procesamiento de textos, PDF, imágenes, hojas de cálculo y programas ejecutables. Si abre un archivo binario en el Bloc de notas o en TextEdit, se verá como un sinsentido revuelto.

El programa Windows calc.exe abierto en el Bloc de notas

Dado que cada tipo de archivo binario debe ser manejado a su manera, este articulo no entrará en la lectura y escritura de archivos binarios en bruto directamente. Afortunadamente, hay muchos módulos que facilitan el trabajo con archivos binarios; uno de ellos, el módulo shelve, se explorará más adelante en este articulo. El método read_text() del módulo pathlib devuelve una cadena con el contenido completo de un archivo de texto. Su método write_text() crea un nuevo archivo de texto (o sobrescribe uno existente) con la cadena que se le pasa. Introduzca lo siguiente en el shell interactivo:

>>> from pathlib import Path
>>> p = Path('spam.txt')
>>> p.write_text('Hello, world!')
13
>>> p.read_text()
'Hello, world!'

Estas llamadas al método crean un archivo spam.txt con el contenido 'Hello, world!' El 13 que devuelve write_text() indica que se han escrito 13 caracteres en el archivo. La llamada read_text() lee y devuelve el contenido de nuestro nuevo archivo como una cadena: 'Hello, world!'.

Tenga en cuenta que estos métodos del objeto Path sólo proporcionan interacciones básicas con los archivos. La forma más común de escribir en un archivo implica el uso de la función open() y los objetos archivo. Hay tres pasos para leer o escribir archivos en Python:

  • Llamar a la función open() para devolver un objeto File.
  • Llamar al método read() o write() en el objeto File.
  • Cerrar el archivo llamando al método close() en el objeto File.

Repasaremos estos pasos en las siguientes secciones.

Abrir archivos con la función open()

Para abrir un archivo con la función open(), se le pasa una cadena de ruta que indica el archivo que se quiere abrir; puede ser una ruta absoluta o relativa. La función open() devuelve un objeto File.

Pruebe a crear un archivo de texto llamado hello.txt utilizando el Bloc de notas o TextEdit. Escriba Hello, world! como contenido de este archivo de texto y guárdelo en su carpeta de inicio de usuario. A continuación, introduzca lo siguiente en el shell interactivo:

>>> helloFile = open(Path.home() / 'hello.txt')

La función open() también puede aceptar cadenas. Si está utilizando Windows, introduzca lo siguiente en el intérprete de comandos interactivo:

>>> helloFile = open('C:\\Users\\your_home_folder\\hello.txt')

Si está utilizando macOS, introduzca lo siguiente en el intérprete de comandos interactivo en su lugar:

>>> helloFile = open('/Users/your_home_folder/hello.txt')

Asegúrate de sustituir your_home_folder por el nombre de usuario de tu ordenador. Por ejemplo, mi nombre de usuario es Al, por lo que introduciría ‘C:\\Users\\Al\\hello.txt’ en Windows. Ten en cuenta que la función open() acepta objetos Path a partir de Python 3.6. En versiones anteriores, siempre hay que pasar una cadena a open().

Ambos comandos abrirán el archivo en modo «lectura de texto plano», o modo de lectura para abreviar. Cuando un archivo se abre en modo lectura, Python sólo permite leer datos del archivo; no se puede escribir ni modificar de ninguna manera. El modo de lectura es el modo por defecto para los archivos que se abren en Python. Pero si no quieres confiar en los valores por defecto de Python, puedes especificar explícitamente el modo pasando el valor de la cadena 'r' como segundo argumento a open(). Así que open('/Users/Al/hello.txt', 'r') y open('/Users/Al/hello.txt') hacen lo mismo.

La llamada a open() devuelve un objeto File. Un objeto File representa un archivo en tu ordenador; es simplemente otro tipo de valor en Python, muy parecido a las listas y diccionarios con los que ya estás familiarizado. En el ejemplo anterior, almacenaste el objeto File en la variable helloFile. Ahora, siempre que quieras leer o escribir en el archivo, puedes hacerlo llamando a los métodos del objeto File en helloFile.

Leer el contenido de los archivos

Ahora que tiene un objeto File, puede empezar a leer de él. Si desea leer todo el contenido de un archivo como un valor de cadena, utilice el método read() del objeto File. Continuemos con el objeto File hello.txt que almacenaste en helloFile. Introduzca lo siguiente en el shell interactivo:

>>> helloContent = helloFile.read()
>>> helloContent
'Hello, world!'

Si piensa en el contenido de un archivo como un único valor de cadena ademas uno muy grande, el método read() devuelve la cadena que está almacenada en el archivo.

Alternativamente, puedes usar el método readlines() para obtener una lista de valores de cadena del archivo, una cadena por cada línea de texto. Por ejemplo, cree un archivo llamado sonnet29.txt en el mismo directorio que hello.txt y escriba en él el siguiente texto.

When, in disgrace with fortune and men's eyes,
I all alone beweep my outcast state,
And trouble deaf heaven with my bootless cries,
And look upon myself and curse my fate,

Asegúrate de separar las cuatro líneas con saltos de línea. A continuación, introduce lo siguiente en el intérprete de comandos interactivo:

>>> sonnetFile = open(Path.home() / 'sonnet29.txt')
>>> sonnetFile.readlines()
[When, in disgrace with fortune and men's eyes,\n', ' I all alone beweep my
outcast state,\n', And trouble deaf heaven with my bootless cries,\n', And
look upon myself and curse my fate,']

Observe que, excepto la última línea del archivo, cada uno de los valores de las cadenas termina con un carácter de nueva línea \n. Una lista de cadenas es a menudo más fácil de trabajar que un solo valor de cadena grande.

Escribir en archivos

Python permite escribir contenido en un archivo de forma similar a como la función print() «escribe» cadenas en la pantalla. Sin embargo, no puedes escribir en un archivo que hayas abierto en modo de lectura. En su lugar, necesitas abrirlo en modo «escribir texto plano» o en modo «añadir texto plano», o modo de escritura y modo de añadir para abreviar.

El modo de escritura sobrescribirá el archivo existente y empezará desde cero, igual que cuando sobrescribes el valor de una variable con un nuevo valor. Pase 'w' como segundo argumento a open() para abrir el archivo en modo de escritura. El modo de apuntar, por otro lado, añadirá texto al final del archivo existente. Puede pensar en esto como añadir a una lista en una variable, en lugar de sobrescribir la variable por completo. Pase 'a' como segundo argumento a open() para abrir el archivo en modo apéndice.

Si el nombre de archivo pasado a open() no existe, tanto el modo de escritura como el de adición crearán un nuevo archivo en blanco. Después de leer o escribir un archivo, llame al método close() antes de abrir el archivo de nuevo.

Unamos estos conceptos. Introduzca lo siguiente en el shell interactivo:

>>> baconFile = open('bacon.txt', 'w')   
>>> baconFile.write('Hello, world!\n')
13
>>> baconFile.close()
>>> baconFile = open('bacon.txt', 'a')
>>> baconFile.write('Bacon is not a vegetable.')
25
>>> baconFile.close()
>>> baconFile = open('bacon.txt')
>>> content = baconFile.read()
>>> baconFile.close()
>>> print(content)
Hello, world!
Bacon is not a vegetable.

Primero, abrimos bacon.txt en modo de escritura. Como todavía no hay un bacon.txt, Python crea uno. Llamando a write() en el archivo abierto y pasando a write() el argumento de la cadena 'Hello, world!\n' escribe la cadena en el archivo y devuelve el número de caracteres escritos, incluyendo la nueva línea. Luego cerramos el archivo.

Para añadir texto al contenido existente del archivo en lugar de reemplazar la cadena que acabamos de escribir, abrimos el archivo en modo apéndice. Escribimos 'Bacon is not a vegetable.' en el archivo y lo cerramos. Finalmente, para imprimir el contenido del archivo en la pantalla, abrimos el archivo en su modo de lectura por defecto, llamamos a read(), almacenamos el objeto File resultante en content, cerramos el archivo, e imprimimos el contenido.

Tenga en cuenta que el método write() no añade automáticamente un carácter de nueva línea al final de la cadena como hace la función print(). Tendrá que añadir este carácter usted mismo.

A partir de Python 3.6, también puede pasar un objeto Path a la función open() en lugar de una cadena para el nombre del archivo.

Deja una respuesta