HOWTO · Python

Leer un CSV con su encabezado en Python

Aprenda a leer un CSV con su encabezado en Python.

En esta página

El módulo csv de la biblioteca estándar de Python permite leer un archivo separado por comas, fila por fila. A menudo, la primera fila de un CSV contiene los nombres de las columnas y las siguientes contienen los registros. Los ejemplos suponen que el archivo tiene esa estructura; csv.reader no trata automáticamente la primera fila como encabezado. Devuelve un iterable de filas, cada una representada como una lista de cadenas.

Los ejemplos crean un archivo de entrada pequeño, así que puedes ejecutarlos sin descargar un archivo adicional. Para trabajar con un archivo real, sustituye la creación del archivo temporal por su ruta y ábrelo con newline="" y una codificación adecuada. También puedes inspeccionar el archivo CSV de ejemplo con direcciones de correo. La salida después de cada ejemplo muestra el resultado observado.

Leer un archivo CSV con su encabezado en Python

Pasa un archivo de texto abierto a csv.reader e itera sobre el resultado. El bucle incluye todas las filas, así que la primera lista impresa contiene los nombres de las columnas. Este método resulta útil si quieres inspeccionar los registros sin procesar antes de tratar el encabezado por separado.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import csv
import tempfile

with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="", delete=False) as source:
    source.write("name,team\nAda,Research\nLin,Design\n")
    path = source.name

with open(path, encoding="utf-8", newline="") as source:
    rows = csv.reader(source)
    for row in rows:
        print(row)
['name', 'team']
['Ada', 'Research']
['Lin', 'Design']

El lector analiza los campos según las reglas de entrecomillado de CSV; dividir cada línea manualmente por comas puede dar resultados incorrectos si un campo contiene una coma entre comillas. La iteración recorre el archivo una sola vez, por lo que el tiempo aumenta de forma lineal con el tamaño de la entrada. Si el archivo es grande, este método no necesita mantener todas las filas en memoria a la vez.

Extraer el encabezado y procesar las filas por separado

Llama a la función integrada next() sobre el lector para consumir su primera fila y guardarla como encabezado. El lector continúa desde la fila siguiente, de modo que el bucle procesa solo los registros de datos. Así se separan los nombres de las columnas de sus valores sin cargar todo el archivo en una lista.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import csv
import tempfile

with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="", delete=False) as source:
    source.write("name,team\nAda,Research\nLin,Design\n")
    path = source.name

with open(path, encoding="utf-8", newline="") as source:
    rows = csv.reader(source)
    header = next(rows)
    print("Header:", ", ".join(header))
    for row in rows:
        print(dict(zip(header, row)))
Header: name, team
{'name': 'Ada', 'team': 'Research'}
{'name': 'Lin', 'team': 'Design'}

Aquí, zip empareja cada nombre de columna con el campo correspondiente, y dict permite acceder a esos pares por nombre. Se supone que el archivo tiene una fila de encabezado y que los campos de cada registro aparecen en el mismo orden. Si el archivo puede estar vacío, comprueba que haya una primera fila antes de usarla como encabezado; de lo contrario, next() no tendrá ninguna fila que devolver.

Leer un CSV con un delimiter diferente

La coma es el separador predeterminado. Si el archivo usa punto y coma, pasa el argumento delimiter a csv.reader; usa el carácter que realmente separa los campos en tu archivo. El lector se comporta igual, pero el tratamiento del encabezado sigue siendo explícito: por convención, la primera fila contiene el encabezado; csv.reader no lo interpreta como tal, así que este ejemplo lo consume con next() antes de imprimir los registros.

Ejecuta este ejemplo:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

import csv
import tempfile

with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8", newline="", delete=False) as source:
    source.write("name;team\nAda;Research\nLin;Design\n")
    path = source.name

with open(path, encoding="utf-8", newline="") as source:
    rows = csv.reader(source, delimiter=";")
    header = next(rows)
    print("Header:", ", ".join(header))
    for row in rows:
        print(", ".join(row))
Header: name, team
Ada, Research
Lin, Design

Para otros formatos, asigna a delimiter el separador que use el archivo, como un tabulador. Mantén newline="" al abrir archivos para el módulo CSV y elige una codificación que coincida con los datos de origen. Si las filas contienen campos entrecomillados o saltos de línea incrustados, deja que csv.reader los analice en lugar de preprocesar las líneas por tu cuenta.