CSV con tabla temporal en Python

Clase 43 de 49Curso Práctico de Python: Creación de un CRUD

Resumen

Actualizar un registro de cliente de forma fiable exige un flujo claro y seguro. Aquí verás cómo implementar update_client, comparar por UID, convertir objetos con to_dict y persistir en CSV usando una tabla temporal y el módulo os para evitar corrupción de datos.

¿Cómo actualizar un cliente con Python sin romper el CSV?

Para modificar un cliente se define un método Update Client que recibe self y un updated client. Primero se obtiene la lista con List Clients. Luego se recorre y se arma una nueva lista Updated clients que reemplaza solo el elemento editado.

  • Obtener la lista: llamar a List Clients sobre self.
  • Inicializar Updated clients como lista vacía.
  • Recorrer cada cliente con un for loop.
  • Comparar por UID entre el cliente iterado y el updated client.
  • Reemplazar el que coincide con el UID por el updated client.
  • Mantener sin cambios los demás clientes.
  • Convertir cada elemento con to_dict antes de escribir en CSV.
  • Guardar en disco con save to disc.

¿Qué hace el método update client?

import csv

class ClientService:
    def update_client(self, updated_client):
        clients = self.list_clients()  # List Clients
        updated_clients = []  # Updated clients

        for client in clients:
            if client.uid == updated_client.uid:  # comparar por UID
                updated_clients.append(updated_client.to_dict())  # to_dict
            else:
                updated_clients.append(client.to_dict())

        self.save_to_disc(updated_clients)  # save to disc

¿Por qué guardar con una tabla temporal y módulos del sistema?

Si el archivo original se abrió en lectura para listar, no se debe sobrescribir directamente. La solución segura es escribir en una tabla temporal (Temporary Table Name) y después renombrarla al Table name original. Así se evita corrupción y se mantiene consistencia.

  • Crear temporary_table_name a partir de table_name y sufijo .TMP.
  • Abrir el archivo temporal con open para escritura.
  • Construir el writer con csv.DictWriter y los field names del esquema de cliente.
  • Escribir todas las filas con writerows.
  • Eliminar el archivo original con os.remove.
  • Renombrar el temporal con os.rename al Table name original.

¿Cómo implementar save to disc de forma segura?

import os
import csv

class ClientService:
    table_name = "clients.csv"  # Table name

    def save_to_disc(self, clients):  # save to disc
        temporary_table_name = f"{self.table_name}.TMP"  # Temporary Table Name

        # abrir temporal y declarar writer
        with open(temporary_table_name, "w", newline="") as file:  # open file
            writer = csv.DictWriter(file, fieldnames=self.client_schema)  # field names / schema
            writer.writerows(clients)  # write rows

        # eliminar original y renombrar temporal
        os.remove(self.table_name)
        os.rename(temporary_table_name, self.table_name)

¿Qué conceptos y habilidades clave se refuerzan?

Este flujo practica escritura segura en CSV y reemplazo atómico de datos, ideal para evitar inconsistencias y pérdidas.

  • Comparación por UID: identifica con precisión el registro a actualizar.
  • Conversión con to_dict: Python escribe diccionarios en CSV, no objetos.
  • Patrón de escritura segura: tabla temporal y renombrado final.
  • Uso de csv.DictWriter: declara writer con field names y usa writerows.
  • Manejo de archivos con open: lectura para listar, escritura para persistir.
  • Operaciones del sistema con os: remove y rename para cambiar archivos.
  • Estructura del servicio: update_client, list_clients, save_to_disc como responsabilidades claras.
  • Control de flujo con for loop: construir Updated clients sin mutar la lista original.

¿Te gustaría que se muestre el ajuste de los comandos para ejecutar la actualización desde la línea de comandos? Deja tus dudas y lo preparamos.