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
classClientService:defupdate_client(self, updated_client): clients = self.list_clients()# List Clients updated_clients =[]# Updated clientsfor client in clients:if client.uid == updated_client.uid:# comparar por UID updated_clients.append(updated_client.to_dict())# to_dictelse: 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
classClientService: table_name ="clients.csv"# Table namedefsave_to_disc(self, clients):# save to disc temporary_table_name =f"{self.table_name}.TMP"# Temporary Table Name# abrir temporal y declarar writerwithopen(temporary_table_name,"w", newline="")asfile:# 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.
Hay dos errores potenciales, en el codigo que se ve en el video, pasa que no entiendo porque platzi recorta los videos y deja a los alumnos con un mal sin sabor.... no me gusta esto para anda...
me salvaste. ya no sabia que hacer ni por donde buscar el error en el codigo...no pueden recortar cosas como esa.
Gracias por la respuesta, coincido totalmente, hay videos en donde me he tenido que buscar muchas cosas porque surgen demasiadas dudas, he quedado totalmente decepcionado del curso y de Platzi.
Recomiendo altamente otras plataformas como Udemy, Coursera y Udacity.
Me costó mucho entender estos dos ultimos videos, los ví graves, se saltaron explicaciones importantes, creo que todo está muy fuera de contexto, algún esquema inicial, introduccion a click y por qué se usa ese esquema de carpetas sería de gran ayuda, aparte la explicación de POO es muy pobre, siento que ahí fallaron un poco.
también siento lo mismo, laso últimos temas se los pasaron super rápido y nada mas por un vistazo
Es cierto, necesitan volver a estructurar este curso y desglozar cada tema un poco más, especialmente con la librería click
Que buen aporte, llevo una hora tratando de hacer que funcione. Estaba en la clase que sigue, pero me dio por regresar a esta para ver que hice mal y en un comentario encontre la solución. MIL GRACIAS. Y si alguien me puede decir porque el código del profesor corre tal cual esta y porque en mi caso teniendolo igual no me corrio, le agradeceria mucho su respuesta, pues no me funciono hasta que hize la modificacion del comentario
Error en el segundo 3:45 deben agregar el modo en el que abren el archivo, sino les dará error.
Escriban lo siguiente:
withopen(tmp_table_name, mode ='w')asf:
Bro, también había pensado lo mismo.
Gracias.
Una consulta, por que a David le funciona sin colocar el self en la funcion _save_to_disk?
Yo creo que después lo corrige, es como en la clase siguiente que apareció un trozo de código de la nada, esas correcciones fuera de cámara como molestan y te hacen estar buscando un error que aparentemente no es error
¡Hola Saúl! Tu feedback nos sirve mucho para mejorar, ten sabido que lo vamos a tener en cuenta para la próxima actualización del curso 💪🏼
He llegado a este punto sin entender casi nada de lo que se ha hecho con POO en Python, es demasiado contenido para el ultimo bloque, si llegaron hasta aqui y no entendieron casi nada, toca regresar y analizar leccion por leccion junto con el codigo, ademas de hacer busqueda de los temas que queden en duda
¡Hola @gerson-mayer! Tu feedback nos sirve mucho para mejorar, ten sabido que lo vamos a tener en cuenta para la próxima actualización del curso 💪🏼
Exacto! he aprendido mucho investigando y reescribiendo el código y complementándolo. Indudablemente hay que investigar mucho para aprender, siempre quedo muy conforme con todo el contenido que tienen todos los cursos.
Pero en este caso siento que no se ha explicado mucho el POO, que se supone que es el enfoque de este modulo, he aprendido mucho más como arreglar errores que de programación orientada a objetos en Python.
creo que estaría muy bien hacer un esquema previo con lo que se va hacer con los pasos y el resultado y final y porque es asi y no de otra manera y quizá estaría interesante saber todo lo que le falta...
Muy necesario, como el buen pildorasinformaticas
¡Hola Enrique! Tu feedback nos sirve mucho para mejorar, ten sabido que lo vamos a tener en cuenta para la próxima actualización del curso 💪🏼
Decepcionante cómo un curso que en sus inicios era tan fantástico decae por decisiones tan paupérrimas como "terminar rápido la grabación" o no hacer un curso tan extenso.
Creo que todos estamos aquí por aprender y no por sacar certificados de manera pronta. Bajo esa misma lógica, considero que la calidad del curso debe primar por encima de todo, independientemente de si las explicaciones duran 5 minutos o 40.
Platzi team, reevaluen la calidad de este curso, nos están fallando a nosotros como clientes y principalmente como estudiantes.
Se que el curso es antiguo, pero alfguien puede ayudarme por que me salen estos errores en el shell?
File"/home/juniorpeves/Documentos/CRUD/ventas/clients/commands.py", line 86,in update
client_service.update_client(client)File"/home/juniorpeves/Documentos/CRUD/ventas/clients/services.py", line 38,in update_client
if client['uid']== updated_client.uid:AttributeError:'NoneType' object has no attribute 'uid'
podrias mostrar tu codigo del archivo services.py?
Como dice el compañero serviría tener un poco más de contexto, pero los errores te dicen mucho, por ejemplo la última línea dice que existe un error de atributos en el que 'nonetype' no posee el atributo 'uid' y más arriba te dicen las líneas que presentan problemas
Es mala practica llamar "updated_client" a un ´´argumento´´ y llamar "updated_clients" a una ´´variable´´ dentro de una funcion??
Hola, tienden un poco a confundirse, pero la s le da significado de pluralidad, si tú lógica amerita tener una en singular y otra en prural no veo problema.
No veo problemas, me imagino que el caso de uso es que la variable es global
Y desde la función le añades valor a esa variable global.
El código del profe estaba incompleto, el mismo IDE dice apenas se escribe self que algo falta. en la clase 39 esta el código del profe, pero aquí les comparto si quieren adicional ver con list comprehension.
'w'open for writing, truncating the file first
Ya vamos comprendiendo mejor el tema
Es un buen profesor la verdad explica muy bien y detalladamente, he visto algunas quejas sobre algunas de las ultimas clases, pero es que se enseña el uso de un lenguaje no de un framework, mucho no comprenden eso, no se intenta profundizar en el framework, el proyecto final es mas para ver como podemos aplicar lo aprendido y usarlo en el mundo real y si nos llama la atención el framework nos motiva a investigar mas sobre el.
Como yo que le tengo un cariño inmenso a Qt y lo descubrí gracias a que un programa de animacion que es mi favorito de código abierto. Pero solo aprendí a usarlo en C++ y me toco investigar el como usarlo en python y créanme no hay info ni tutos que lo explique, en español ni en ingles (en su modo vainilla y no con diseñadores gráficos con QtDisigner) así que me toco ver su documentación directa del framework en su pagina oficial.
Por eso creo que el profesor hizo un excelente trabajo enseñándonos el lenguaje y en sus ultimas clases nos dio la oportunidad de interesarnos por un framework que puede convertirse en uno de nuestros favoritos o no.
"PD: cuando leia las frases: -- no explica ha profundidad el uso de CLICK o que esta fuera de contexto, cosas y asi-- lo que lei fue: soy un perezoso que no le gusta investigar"
En la parte de abajo de la descripción de habla sobre errores. Eso no pertenece a este curso
La verdad nunca pude ejecutar nada en el cmd, cuando le doy pv --help, o pv client create, etc simplemente no hace nada.
Logré crear el ambiente virtual, y creo que pude ejecutar lo de pip install --editable .
Si le doy where pv, me da dos rutas, el pv.py y uno en pytho38 en el disco C
¿Alguien podría ayudarme? Hice las clases, copié el código, etc, pero la verdad hace como 5 clases que me perdí horrible y no entiendo ni lo que hemos hecho.
Si puedes dejar tu código con gusto te puedo ayudar. También he tenido varios problemas pero por fortuna, los he podido solucionar.
No te desanimes!
Puede ser por un problema de espacios en el path
mira mis apuntes
Application por linea de comandos en python
Hacer una archivo en la carpeta raíz llamado setup.py como este
Si la ruta tiene espacios deba cambiar el encabezado del archivo que esta en .env/bin
Ejemplo el archivo se llama pv esta en .env/bin/pv
#!/bin/sh
'''exec' "/Users/wilsonromero/Documents/Personal/Platzi/Platzi Master/Curso de Python/PlatziVentas/.env/bin/python3" "$0" "$@"
' '''
Es:
writer.writerow
O
writer.writerows
en clients/services.py
en def create_client()
escribe
writer.writerow
y en def _save_to_disk() escribe con s
writer.writerows
Los dos están bien, cada uno hace algo distinto como indica su nombre, writerow solo escribimos una línea y en writerows todas
Xq crea un archivo temporal, si después puede borrar el original sin problema? No es q el original está abierto y no se puede modificar?
Por si alguien se pregunta lo mismo, ya se que paso mucho tiempo desde esta pregunta.
.
Lo mismo que hicimos en clases pasadas, al temporal se le pasa la info con actualizada porque como al hacer list_clients() lo abre en modo lectura, internamente ya esta abierto, como cuadno uno tiene un archivo de windows abierto y le va a cambiar el nombre o eliminar y te dice que esta en uso.
'w'open for writing, truncating the file first
Por que me aparece que "self" is not defined?
está incompleto, falta agregar self cómo primer parámetro, todos los métodos de una clase siempre es necesario utilizar el parámetro self
Lo más útil del curso fue saber que existía click y que de alguna manera nos puede ayudar para lo que buscamos... pero no más. Para aprenderlo nos va tocar navegar por internet y buscar información gratuita que no conseguimos en un sitio de PAGO como lo es Platzi.
No tiene sentido, estoy sumamente defraudado, deberían grabar nuevamente este curso pero con Facundo que sí sabe organizar sus ideas.
Desde la clase 39 en adelante me ha constado mucho entender :(.