Entrada

Python 🐍 : Manejo de Archivos Básico

Uno de los aspectos más comunes en la programación es el manejo de archivos. Python nos facilita la interacción con archivos mediante su módulo incorporado open(), que permite abrir, leer, escribir y modificar archivos fácilmente.

En este artículo, nos enfocaremos en cómo leer y escribir archivos de texto, como los que se crean con un editor. Más adelante veremos cómo manejar archivos más complejos, como bases de datos, que son archivos binarios diseñados específicamente para ser usados por sistemas especializados.

¿Por qué es importante el manejo de archivos?

El manejo de archivos es una de las habilidades más prácticas y necesarias cuando pasas de escribir scripts simples a desarrollar aplicaciones reales en Python. Si bien al inicio puedes resolver problemas en memoria, tarde o temprano vas a necesitar guardar información de forma persistente.

El manejo de archivo nos permite abrirnos a las siguientes posibilidades:

📁 1. Persistencia de datos

Guardar información para que esté disponible incluso después de cerrar el programa. Esto es clave en aplicaciones como:

  • Gestores de tareas
  • Juegos que necesitan guardar el progreso
  • Formularios o encuestas donde se guardan respuestas
  • Carritos de compras en tienda online

🔁 2. Automatización de tareas

Muchos scripts automatizados trabajan leyendo y escribiendo archivos.

  • Descargar y procesar archivos de una web o API
  • Renombrar archivos por lote
  • Generar reportes en PDF, TXT o CSV automáticamente

🔗 3. Integración con otras herramientas y sistemas

Los archivos .csv, .json, .xml y .txt son formatos comunes para intercambiar datos:

  • Abrir datos exportados desde Excel o una base de datos
  • Leer archivos de configuración o logs generados por otros programas
  • Escribir archivos que puedan ser leídos por herramientas externas

📊 4. Análisis de grandes volúmenes de información

En data science, los datos suelen venir en archivos planos. Python permite:

  • Leer y procesar archivos de texto de varios gigabytes de tamaño
  • Transformar y limpiar información
  • Convertir archivos entre distintos formatos

🛠️ 5. Registro y trazabilidad

Guardar el comportamiento del programa o de los usuarios en un archivo log es fundamental para:

  • Auditar acciones
  • Rastrear errores
  • Generar estadísticas internas

¿Cómo funciona la apertura de archivos?

Para abrir un archivo, una aplicación solicita al sistema operativo el acceso y el sistema operativo gestiona su apertura. El proceso se realiza de la siguiente manera:

flowchart TD
    A[Aplicación pide abrir un archivo] --> B[SO busca el archivo]
    B --> C{¿Archivo encontrado?}
    C -- No --> X["Error: no existe"]
    C -- Sí --> D[Verificar permisos]
    D --> E{"¿Permisos válidos?"}
    E -- No --> Y[Error: acceso denegado]
    E -- Sí --> F[Preparar archivo para acceso]
    F --> G["Devolver identificador a la aplicación"]

📝 Abrir archivos con Python

La manera más habitual de trabajar con archivos en Python es con la función incorporada open(). Esta función permite abrir un archivo y especificar el modo de apertura, lo que determina qué tipo de operaciones se pueden realizar sobre él (leer, escribir, agregar contenido, etc).

Es importante dominar los conceptos de ruta relativa y ruta absoluta para trabajar con archivos. Te recomiendo este artículo: https://phoenixnap.com/kb/absolute-path-vs-relative-path

La función open() recipe como primer argumento la ruta del archivo que se desea manejar, proporcionada como una cadena de texto ( string ). El segundo argumento es el modo de apertura, también especificado como una cadena de texto, y define cómo se interactuará con el archivo.

Sintaxis Básica - open

1
archivo = open("ruta/del/archivo.txt", "modo", encoding="utf-8")

Argumentos:

  • "ruta/del/archivo.txt": es la ubicación del archivo que deseas abrir. Puede ser una ruta relativa (como “archivo.txt”) o una ruta absoluta (como “/home/usuario/documentos/archivo.txt”).

  • "modo": es el tipo de operación que deseas realizar en el archivo. Dependiendo del modo, podrás leer, escribir o agregar contenido al archivo.

  • encoding="utf-8": es opcional, pero se recomienda para evitar problemas con caracteres especiales, especialmente si estás trabajando con textos que contienen acentos, eñes, o caracteres no latinos.

Modos de apertura

  • "r": solo lectura (el archivo debe existir).
  • "w": solo escritura (sobrescribe el archivo si ya existe, o lo crea si no).
  • "a": agregar contenido al final del archivo (sin borrar lo que ya tiene).
  • "x": creación exclusiva (solo crea el archivo si no existe).
  • "r+": lectura y escritura (el archivo debe existir).

¿Qué es un manejador de archivo?

Cuando usas la función open(), Python no abre el archivo directamente como un objeto “normal”. En su lugar, crea un objeto de tipo TextIOWrapper que sirve como manejador ( o “handler” ) del archivo. Este manejador actúa como un intermediario entre tu programa y el archivo, permitiéndote leer, escribir o manipular su contenido a través de dirversos métodos.

Podemos realizar algunas pruebas en una sesión interactiva de Python:

Python 3.10.2 (main, Feb 14 2024, 23:15:40) [Clang 14.0.0 (clang-1400.0.29.202)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> manejador = open('mi_archivo.txt')
>>> manejador
<_io.TextIOWrapper name="mi_archivo.txt" mode="r" encoding="cp65001">

>>> type(manejador)
<class "_io.TextIOWrapper">

Si el resultado de la función open() es exitoso, el sistema operativo nos devuelve una instancia de TextIOWrapper que es una clase en el módulo io de Python que se utiliza para manejar flujos de entrada/salida de texto, que en este caso lo estamos asignando a una variable llamada manejador. El manejador de archivo no son los datos contenidos en el archivo, sino un manejador que podemos usar para leer los datos.

Leer Archivo - Modo lectura ( “r” )

Para leer un archivo sabemos que lo primero es abrir el respectivo archivo usando la función open(), si nos ponemos a pensar en una lista de amigos que tenemos en un archivo de texto llamado amigos.txt con el siguiente contenido:

1
2
3
4
5
Marco
Luis
Gabriel
Alejandro
Pedro

Luego de usar la función open, abrimos el archivo en modo lectura (si no le pasamos un segundo argumento a la función open() por defecto es modo lectura) y usamos el método read() del manejador:

>>> manejador = open('amigos.txt')
>>> manejador.read()
"Marco\nLuis\nGabriel\nAlejandro\nPedro\n"

Este método read() lee todo el contenido del archivo como una sola cadena de texto. Puede ser útil para archivos pequeños.

Una vez ejecutado el método read() del manejador si no se guarda el resultado en una variable, se debe volver a posicionar el puntero al inicio (usando el método seek(0) del maneajor).

Leer por cantidades

El método read() si se le pasa el argumento size lee esa cantidad de bytes. Si se omite lee todo el el contenido restante del archivo. Por ejemplo:

>>> manejador = open('amigos.txt')
>>> manejador.read(10)
"Marco\nLuis"
>>> manejador.read()
"\nGabriel\nAlejandro\nPedro\n"

Leer línea por línea

El método readline() lee una sola línea del archivo. Es útil para leer archivos línea por línea. Por ejemplo:

>>> manejador = open('amigos.txt')
>>> manejador.readline()
"Marco\n"
>>> manejador.readline()
"Gabriel\n"

Leer todo y separar

El método readlines() lee todas las líneas del archivo y las devuelve como una lista de cadenas, donde cada línea es un elemento de la lista.

>>> manejador = open('amigos.txt')
>>> manejador.readlines()
['Marco\n', 'Luis\n', 'Gabriel\n', 'Alejandro\n', 'Pedro\n']

Escritura de un archivo - Modo escritura ( “w” | “a” )

Para escribir texto en un archivo en Python, es necesario abrir el archivo en el modo escritura:

1
manejador = open('amigos.txt', 'w')

Escribir una sola cadena

El método write() se utiliza para escribir una única cadena de texto en un archivo. Es importante destacar que no añade automáticamente saltos de línea. Por lo tanto, si deseas que cada entrada aparezca en una línea separada, debes incluir explícitamente el carácter de nueva línea (\n) al final de cada cadena.

>>> manejador = open('amigos.txt', 'w')
>>> manejador.write("Juan")

Si revisamos el archivo amigos.txt nos encontraremos con la sorpresa de que se sobreescribio el contenido:

1
Juan

Esto sucede porque el segundo argumento 'w' se refiere al modo de solo escritura, por lo que los datos existentes en el archivo de modifican y sobrescriben y si el archivo aún no existe, se crea uno nuevo. Por otro lado no podemos leer el archivo usando el método read() si quisieramos leer el archivo debemos usar 'w+' para cambiar al modo de escritura y lectura.

Escribir al final de un archivo

El modo 'a' ( append ) permite abrir un archivo para escritura colocando el cursor al final del contenido existente. Si el archivo aún no existe, se crea uno nuevo. A diferencia del modo 'w', que borra el contenido anterior. Por ejemplo:

>>> manejador = open('amigos.txt', 'a')
>>> manejador.write("\nArmando")

Al igual que en el caso anterior, si queremos además leer el archivo debemos cambiar al modificador 'a+'.

Si revisamos el archivo amigos.txt tenemos el contenido añadido al final:

1
2
Juan
Armando

Escribir múltiples líneas

El método writelines() nos permite escribir múltiples líneas a la vez. Ejemplo:

>>> manejador = open('amigos.txt', 'a')
>>> amigos = ['\nFabián', '\nMateo', '\nLeonardo']
>>> manejador.writelines(amigos)

Propiedades del objeto file

Además de los diferentes métodos que podemos acceder desde el objeto File, también podemos acceder a diferentes propiedades para conocer más sobre el objeto que estamos utilizando.

Se pueden acceder a las siguientes propiedades:

  • closed: retorna True si el archivo se ha cerrado, en caso contrario será False.
  • mode: retorna el modo en el que fue abierto el archivo.
  • name: retorna el nombre del archivo.
  • encoding: retorna la codificación de caracteres del archivo.

Podemos ver un ejemplo

1
2
3
4
5
6
7
manejador = open("amigos.txt", "a+")
content = manejador.read()
nombre = manejador.name # 'amigos.txt'
modo = manejador.mode # a+
encoding = manejador.encoding # cp1252
manejador.close()
manejador.closed # True

Consideraciones adicionales

Manejo de excepciones

Siempre es buena práctica manejar posibles excepciones cuando se trabaja con archivos. Puedes usar try y except para capturar errores como FileNotFoundError o IOError.

Codificación de archivos

Cuando trabajas con archivos de texto, es importante tener en cuenta la codificación de los datos. Python usa por defecto la codificación UTF-8, pero si el archivo está en otro formato, como ISO-8859-1 (que abarca idiomas de Europa occidental) o ASCII (que solo abarcaba caracteres del inglés), debemos especificar la codificación al abrir el archivo:

1
2
3
with open("archivo.txt", "r", encoding="utf-8") as archivo:
    contenido = archivo.read()
    print(contenido)

Verificación de la existencia del archivo

Antes de intentar abrir un archivo, especialmente si estás trabajando con archivos que podrían no existir, es recomendable verificar si el archivo existe primero. Esto evita posibles excepciones, como un FileNotFoundError:

1
2
3
4
5
6
7
8
9
10
import os

archivo = "archivo.txt"

if os.path.exists(archivo): # Verificación con os.path:
    with open(archivo, "r") as f:
        contenido = f.read()
        print(contenido)
else:
    print("El archivo no existe.")

Esto también puede ser útil cuando estás realizando operaciones de escritura y no deseas sobrescribir un archivo accidentalmente.

Permisos de Archivos

En sistemas operativos como Linux o MacOS, los archivos pueden tener permisos restrictivos. Por eso debemos estar seguros si ese archivo tiene los permisos adecuados para leer o escribir en él. Por ejemplo:

1
2
3
4
5
6
7
8
9
10
import os

archivo = "archivo.txt"

if os.access(archivo, os.R_OK):  # Verifica si se puede leer
    archivo = open(archivo, "r")
    print(archivo.read())
    archivo.close()
else:
    print("No tienes permiso para leer este archivo.")

El manejo de archivos en Python es esencial para almacenar y recuperar datos de manera persistente. La función open() permite abrir archivos en diversos modos (lectura, escritura, adición) y se debe cerrar adecuadamente para liberar recursos.

Además, los métodos write() y writelines() permiten escribir datos en archivos, siendo write() adecuado para una única cadena y writelines() para listas de cadenas. Es importante recordar que ninguno de estos métodos añade saltos de línea automáticamente; por lo tanto, se debe incluir explícitamente \n si se desea separar las líneas en el archivo.

Esta entrada está licenciada bajo CC BY 4.0 por el autor.