Leer datos CSV en objetos personalizados
Cuando se trabaja con archivos CSV en Python, a menudo es deseable leer los datos en objetos personalizados en lugar de trabajar con estructuras de datos sin procesar como listas o diccionarios. Este enfoque te permite encapsular los datos y la lógica asociada dentro de tus propias clases, lo que hace que el código esté más organizado, sea más fácil de mantener y de trabajar.
Para leer datos CSV en objetos personalizados, puedes utilizar el módulo csv
incorporado en Python, junto con el concepto de clases de datos (introducido en Python 3.7) o clases regulares.
Usando clases de datos
Las clases de datos de Python proporcionan una forma conveniente de definir objetos personalizados y generar automáticamente código repetitivo, como los métodos __init__()
, __repr__()
y __eq__()
. Aquí tienes un ejemplo de cómo usar clases de datos para leer datos CSV:
from dataclasses import dataclass
import csv
@dataclass
class Person:
name: str
age: int
city: str
with open('people.csv', 'r') as file:
reader = csv.DictReader(file)
people = [Person(**row) for row in reader]
for person in people:
print(person)
En este ejemplo, la clase Person
se define utilizando el decorador @dataclass
, que genera automáticamente los métodos necesarios. El csv.DictReader
se utiliza para leer los datos CSV en un diccionario, y luego cada fila se utiliza para crear un objeto Person
.
Usando clases regulares
Como alternativa, puedes usar clases regulares de Python para lograr el mismo resultado:
import csv
class Person:
def __init__(self, name, age, city):
self.name = name
self.age = age
self.city = city
def __repr__(self):
return f"Person(name='{self.name}', age={self.age}, city='{self.city}')"
with open('people.csv', 'r') as file:
reader = csv.reader(file)
next(reader) ## Skip the header row
people = [Person(*row) for row in reader]
for person in people:
print(person)
En este ejemplo, la clase Person
se define manualmente, con un método __init__()
para inicializar los atributos del objeto y un método __repr__()
para proporcionar una representación en cadena del objeto.
Ambos enfoques te permiten trabajar con los datos CSV de una manera más estructurada y orientada a objetos, lo que facilita la gestión y manipulación de los datos dentro de tu aplicación de Python.