Trabajo con Archivos. En este capítulo aprenderemos a manejar archivos en Python, una habilidad esencial para desarrollar aplicaciones que interactúan con datos externos. Exploraremos cómo abrir, leer, escribir y cerrar archivos de texto, así como trabajar con formatos específicos como CSV y JSON que son ampliamente utilizados para almacenar y transferir información estructurada. También veremos cómo gestionar archivos y directorios en el sistema operativo, incluyendo creación, eliminación y navegación por rutas. Este capítulo te proporcionará las herramientas necesarias para interactuar eficientemente con el sistema de archivos y manipular datos de manera profesional y segura.
Manos a la obra….
Lectura y Escritura de Archivos
La operación más básica al trabajar con archivos en Python es abrir un archivo utilizando la función open()
, que permite especificar el modo en el que se desea abrir el archivo. Los modos más comunes son:
'r'
: Modo de lectura (por defecto).'w'
: Modo de escritura (sobrescribe el archivo si ya existe).'a'
: Modo de anexado (añade contenido al final del archivo).'b'
: Modo binario (para archivos que no de texto).'x'
: Modo de creación (crea un nuevo archivo y genera un error si ya existe).
Ejemplo de escritura de un archivo:
# Abrir un archivo en modo escritura
with open('archivo.txt', 'w') as archivo:
archivo.write("Hola, mundo!\n")
archivo.write("Este es un archivo de texto.\n")
En este ejemplo abrimos el archivo con nombre «archivo.txt» en modo escritura y posteriormente escribimos dentro de él el texto «Hola, mundo!\n» y en la siguiente línea «Este es un archivo de texto.\n».
Fíjate en el \n, esto se llama carácter de escape y lo que hace es insertar un salto de línea. Existen otros caracteres de escape como pueden ser \t para tabulador, \r retorno de carro, \b retroceso,…
@Tip. Usar la declaración with
es una buena práctica porque asegura que el archivo se cierre automáticamente después de que se completa el bloque de código.
Ejemplo de lectura de un archivo:
# Abrir un archivo en modo lectura
with open('archivo.txt', 'r') as archivo:
contenido = archivo.read()
print(contenido)
El método read()
lee todo el contenido del archivo. También se pueden usar otros métodos como readline()
para leer una línea a la vez o readlines()
para leer todas las líneas y devolverlas como una lista.
Cierre de archivos.
Cuando trabajamos con archivos, es muy recomendable cerrarlos una vez finalizadas las operaciones que estemos ejecutando. En muchas ocasiones, cuando se realiza una escritura de datos en disco, esta operación no es instantánea y pasan primero por un buffer hasta que el sistema operativo ejecuta la acción. Con el método close() nos aseguramos de que se terminen de escribir esos datos almacenados en la memoria temporal y así evitar posibles pérdidas.
# Abrimos un archivo en modo de escritura
archivo = open("ejemplo.txt", "w")
# Escribimos texto en el archivo
archivo.write("¡Hola, este es un ejemplo de escritura en un archivo!")
# Cerramos el archivo
archivo.close()
# Verificamos que el archivo se cerró correctamente
if archivo.closed:
print("El archivo ha sido cerrado correctamente.")
Archivos CSV
Los archivos CSV (Comma-Separated Values) son un formato común para almacenar datos en forma de tabla. Python incluye el módulo csv
para facilitar la lectura y escritura de archivos CSV.
Ejemplo de escritura en un archivo CSV:
import csv
# Datos a escribir
datos = [
["Nombre", "Edad", "Ciudad"],
["Ana", 28, "Madrid"],
["Luis", 34, "Barcelona"]
]
# Abrir un archivo CSV en modo escritura
with open('datos.csv', 'w', newline='') as archivo_csv:
escritor = csv.writer(archivo_csv)
escritor.writerows(datos) # Escribir varias filas
El parámetro newline=''
es necesario en Windows para evitar líneas en blanco adicionales en el archivo CSV.
Ejemplo de lectura de un archivo CSV:
import csv
# Abrir un archivo CSV en modo lectura
with open('datos.csv', 'r') as archivo_csv:
datos = csv.reader(archivo_csv)
for fila in datos:
print(fila)
Este código leerá el archivo CSV y mostrará cada una de las filas.
Escritura en un archivo CSV
Para escribir datos en un archivo CSV debemos partir de una estructura de datos (una tabla). Para ello vamos a crear una lista de listas.
import csv
# Definimos los datos que queremos escribir en el archivo
datos = [
["Nombre", "Edad", "Ciudad"],
["Ana", 25, "Madrid"],
["Carlos", 30, "Barcelona"],
["Lucía", 28, "Valencia"]
]
# Abrimos el archivo en modo escritura
with open("personas.csv", mode="w", newline="", encoding="utf-8") as archivo_csv:
# Creamos un objeto writer para escribir en el archivo CSV
archivo = csv.writer(archivo_csv)
# Escribimos las filas en el archivo
for fila in datos:
archivo.writerow(fila)
print("Archivo CSV creado con éxito.")
Explicación
- Importamos el módulo
csv
de la biblioteca estándar para trabajar con archivos CSV de forma sencilla. - Creamos una lista de listas donde cada sublista representa una fila del archivo CSV. La primera fila generalmente se utiliza como encabezado.
- Abrimos el archivo csv con el método
open
y con el modo"w"
(escritura) para abrir o crear el archivopersonas.csv
.- Usamos
newline=""
para evitar líneas en blanco adicionales que pueden aparecer en algunos sistemas. - Indicamos la codificación
utf-8
para soportar caracteres especiales.
- Usamos
- Creamos el objeto «archivo» con el método
csv.writer
que permite escribir filas en el archivo CSV. - Escribimos cada fila en el archivo utilizando el método
writer.writerow
. - Contexto
with
:
La estructurawith
asegura que el archivo se cierre automáticamente una vez que finaliza el bloque, incluso si ocurre un error
Con este ejemplo hemos generado un archivo personas.csv
con el siguiente contenido:
Nombre,Edad,Ciudad
Ana,25,Madrid
Carlos,30,Barcelona
Lucía,28,Valencia
Archivos JSON
Los archivos JSON (JavaScript Object Notation) son un formato de intercambio de datos ligero, fácil de leer para los humanos y sencillo de procesar para las máquinas. Representan datos estructurados como pares clave-valor y listas ordenadas (similares a los diccionarios y listas que vimos en un capítulo anterior).
Un archivo JSON es simplemente un archivo de texto con una extensión .json
que contiene datos en este formato.
Ejemplo de archivo JSON
{
"nombre": "Ana",
"edad": 25,
"ciudad": "Madrid",
"hobbies": ["leer", "viajar", "música"]
}
¿Para qué se utilizan los archivos JSON?
- Intercambio de datos entre sistemas:
JSON es ampliamente utilizado para enviar y recibir datos entre aplicaciones, especialmente en APIs web. Por ejemplo cuando accedes a un servicio web para obtener información de una API de clima, los datos se suelen devolver en formato JSON. - Almacenamiento de datos estructurados:
Los archivos JSON son útiles para guardar configuraciones, datos de usuarios o cualquier tipo de información estructurada que necesite persistir entre ejecuciones de un programa como puede ser la configuración de aplicaciones, datos de juegos, preferencias de usuarios, etc. - Facilidad de integración con lenguajes de programación:
JSON es compatible con muchos lenguajes de programación lo que lo convierte en una opción estándar para el intercambio de información.
Ventajas de JSON
- Legibilidad: Es fácil de entender para los humanos.
- Compacto: Ocupa menos espacio comparado con formatos como XML.
- Flexibilidad: Puede representar datos simples (números, cadenas) o estructuras complejas (listas anidadas, diccionarios).
- Compatibilidad: Es un estándar ampliamente aceptado.
Veamos como manejamos estos tipos de datos en Python.
Ejemplo de escritura en un archivo JSON:
import json
# Datos a escribir
datos = {
"nombre": "Ana",
"edad": 28,
"ciudad": "Madrid"
}
# Abrir un archivo JSON en modo escritura
with open('datos.json', 'w') as archivo_json:
json.dump(datos, archivo_json, indent=4) # Escribir con formato legible
El método dump()
convierte el objeto Python en una cadena JSON y lo escribe en el archivo.
Ejemplo de lectura de un archivo JSON:
import json
# Abrir un archivo JSON en modo lectura
with open('datos.json', 'r') as archivo_json:
datos_leidos = json.load(archivo_json) # Cargar datos desde el archivo
print(datos_leidos)
El método load()
lee el archivo JSON y convierte su contenido en un objeto Python.
Otro tipo de archivos para almacenamiento de datos es XLS pero es algo más complejo y por ahora no lo vamos a abordar. Tea adjunto una pequeña comparativa entre estos formatos.
Comparación con otros formatos
Característica | JSON | XML | CSV |
---|---|---|---|
Legibilidad | Alta | Media | Baja (para datos complejos) |
Soporte jerárquico | Sí | Sí | No |
Simplicidad | Alta | Baja | Alta |
Manejo de Archivos y Directorios
Además de trabajar con archivos individuales, es común necesitar realizar operaciones en directorios, como crear, renombrar, eliminar o listar archivos y carpetas. Python proporciona el módulo os
y shutil
para gestionar estas tareas.
Ejemplo de manejo de directorios:
import os
# Crear un nuevo directorio
os.mkdir('nuevo_directorio')
# Listar archivos y directorios en el directorio actual
for nombre in os.listdir('.'):
print(nombre)
# Renombrar un archivo
os.rename('archivo.txt', 'archivo_renombrado.txt')
# Eliminar un archivo
os.remove('archivo_renombrado.txt')
# Eliminar un directorio
os.rmdir('nuevo_directorio')
El uso de os
te permite interactuar con el sistema de archivos de manera efectiva.
Uso del módulo shutil
para copiar y mover archivos:
import shutil
# Copiar un archivo
shutil.copy('datos.csv', 'copia_datos.csv')
# Mover un archivo
shutil.move('copia_datos.csv', 'nuevo_directorio/copia_datos.csv')
Resumen
El trabajo con archivos en Python es una habilidad fundamental que permite leer y escribir datos en diferentes formatos. Ya sea manipulando archivos de texto simples, trabajando con formatos tabulares como CSV o intercambiando datos estructurados con JSON. Python proporciona herramientas eficientes para manejar todos estos tipos de archivos. Además, con módulos como os
y shutil
, puedes gestionar directorios y realizar operaciones de archivos de manera efectiva, facilitando el desarrollo de aplicaciones que interactúan con el sistema de archivos.
Ejercicio 1: Leer un archivo de texto y contar las líneas
Crea un programa en Python que lea un archivo de texto llamado datos.txt
y cuente cuántas líneas tiene. Si el archivo no existe, el programa debe manejar el error y mostrar un mensaje apropiado.
Crea un programa en Python que lea un archivo de texto llamado
datos.txt
y cuente cuántas líneas tiene. Si el archivo no existe, el programa debe manejar el error y mostrar un mensaje apropiado.# Intentamos abrir y leer el archivo
try:
with open("datos.txt", "r", encoding="utf-8") as archivo:
lineas = archivo.readlines()
print(f"El archivo tiene {len(lineas)} líneas.")
except FileNotFoundError:
print("El archivo 'datos.txt' no existe. Por favor, verifica el nombre o la ubicación del archivo.")
Explicación:
- Apertrua del archivo: Como tenemos que asegurarnos que el programa no falle si el archivo no existe, debemos ejecutar la apertura del archivo y manejo de errores con las sentencias try–except.
- Lectura del archivo: Se usa
open
en modo lectura ("r"
) para abrir el archivo. La funciónreadlines
lee todas las líneas y las devuelve como una lista. - Conteo de líneas: Usamos
len(lineas)
para calcular la cantidad de líneas. - Manejo de errores: Si el archivo no existe, el bloque
except FileNotFoundError
captura el error y muestra un mensaje amigable al usuario.
Ejercicio 2: Escribir datos en un archivo JSON
Escribe un programa que cree un archivo usuarios.json
con información sobre tres usuarios, incluyendo su nombre, edad y correo electrónico.
Escribe un programa que cree un archivo
usuarios.json
con información sobre tres usuarios, incluyendo su nombre, edad y correo electrónico.import json
# Datos a guardar
usuarios = [
{"nombre": "Ana", "edad": 25, "correo": "ana@example.com"},
{"nombre": "Carlos", "edad": 30, "correo": "carlos@example.com"},
{"nombre": "Lucía", "edad": 28, "correo": "lucia@example.com"}
]
# Escribimos los datos en un archivo JSON
with open("usuarios.json", "w", encoding="utf-8") as archivo_json:
json.dump(usuarios, archivo_json, indent=4)
print("El archivo 'usuarios.json' ha sido creado con éxito.")
Explicación:
- Uso del módulo
json
: El métodojson.dump
se utiliza para guardar los datos en formato JSON en un archivo. - Indentación: El parámetro
indent=4
hace que el JSON sea más legible al agregar saltos de línea y sangrías (Este parámetro no es obligatorio). - Estructura de datos: La lista de diccionarios representa la información de los usuarios.
Ejercicio 3: Leer un archivo CSV y calcular el promedio de una columna
Crea un programa que lea un archivo calificaciones.csv
, donde cada fila contiene el nombre de un estudiante y su calificación. Calcula el promedio de las calificaciones y muéstralo en pantalla.
Ejemplo del contenido del archivo calificacionies.csv
Nombre,Calificación
Ana,8.5
Carlos,9.0
Lucía,7.8
Pedro,9.2
Crea un programa que lea un archivo
calificaciones.csv
, donde cada fila contiene el nombre de un estudiante y su calificación. Calcula el promedio de las calificaciones y muéstralo en pantalla.Ejemplo del contenido del archivo calificacionies.csv
Nombre,Calificación
Ana,8.5
Carlos,9.0
Lucía,7.8
Pedro,9.2
import csv
try:
# Abrimos el archivo CSV
with open("calificaciones.csv", "r", encoding="utf-8") as archivo_csv:
lector = csv.reader(archivo_csv)
next(lector) # Saltamos la fila de encabezados
calificaciones = []
for fila in lector:
# Agregamos la calificación (convertida a float) a la lista
calificaciones.append(float(fila[1]))
# Calculamos el promedio
promedio = sum(calificaciones) / len(calificaciones)
print(f"El promedio de las calificaciones es: {promedio:.2f}")
except FileNotFoundError:
print("El archivo 'calificaciones.csv' no existe.")
except ValueError:
print("Se encontraron datos no válidos en el archivo.")
Explicación:
- Lectura del archivo CSV: Usamos
csv.reader
para leer el archivo línea por línea. - Salto de encabezados: La función
next(lector)
omite la primera fila, que contiene los nombres de las columnas. - Conversión de datos: Convertimos las calificaciones de cadenas a flotantes antes de agregarlas a una lista.
- Cálculo del promedio: Se usa
sum
para sumar los valores ylen
para contar cuántos hay. - Manejo de errores:
FileNotFoundError
para verificar si el archivo existe.ValueError
en caso de que haya datos no numéricos en el archivo.
Bibliografía de Python de interés.
- Curso de Programación Python. Autor: Arturo Montejo Ráez y Salud María Jiménez Zafra (Editorial Anaya)
- Aprende Python desde cero hasta avanzado. Autor: Xavier Reyes Ochoa (Editorial Book Shelter GmbH)
- Aprende la Programación Orientada a Objetos con el lenguaje Python. Autor: Vincent Boucheny (Editorial Ediciones ENI)
- 100 Ejercicios Python para praticar. Autor: Laurentine K.Masson (Editorial: Publicación Independiente).