HOWTO · Python

Leia CSV para Array em Python

Este tutorial demonstra como ler um CSV em um array em Python.

Nesta página

Arquivos CSV armazenam registros tabulares em linhas de campos delimitados. Para ler um arquivo em Python, escolha o leitor de acordo com os dados e a estrutura de que você precisa: NumPy para arrays numéricos, o módulo csv da biblioteca padrão do Python para linhas de strings ou pandas para tabelas com rótulos. Os quatro exemplos têm evidências de execução bem-sucedida, e cada um cria seu próprio arquivo CSV temporário.

Leia dados numéricos de CSV com numpy.loadtxt()

Use numpy.loadtxt() quando os campos forem todos numéricos e estiverem organizados em uma tabela regular. O argumento delimiter descreve o separador no texto de entrada. Ele não aparece no array retornado; as vírgulas são interpretadas entre os valores. O valor padrão de delimiter é espaço em branco, então defina-o como vírgula para dados separados por vírgulas. É necessário instalar NumPy para executar este exemplo.

Execute este exemplo:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

from pathlib import Path
from tempfile import TemporaryDirectory
import numpy as np

with TemporaryDirectory() as directory:
    path = Path(directory) / "numbers.csv"
    path.write_text("1,2,3\n4,5,6\n7,8,9\n", encoding="utf-8")
    data_array = np.loadtxt(path, delimiter=",")
    print(data_array)

loadtxt() retorna um array NumPy bidimensional para esta entrada com várias linhas e colunas. Use as operações de array para trabalhar com os valores numéricos. Se o arquivo tiver um cabeçalho, ignore ou trate essa linha explicitamente, em vez de pedir ao leitor numérico que a interprete como números.

Leia linhas de CSV com o módulo csv do Python

O módulo csv.reader da biblioteca padrão funciona com campos de texto ou com valores de tipos diferentes. Ele produz uma lista de strings por linha. Chamar a função integrada list() consome o leitor e materializa todas essas linhas em uma lista de listas; list() é uma função integrada, não um método, e o resultado não é um array NumPy. Essa abordagem é útil quando você quer inspecionar ou transformar cada campo por conta própria.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

from pathlib import Path
from tempfile import TemporaryDirectory
import csv

with TemporaryDirectory() as directory:
    path = Path(directory) / "people.csv"
    path.write_text(
        "Name,Age,Occupation\nJohn,28,Engineer\nJane,34,Doctor\n",
        encoding="utf-8",
    )
    with path.open(newline="", encoding="utf-8") as file:
        rows = list(csv.reader(file))
    print(rows)

O cabeçalho é incluído como a primeira linha, e valores como idades continuam sendo strings até que você os converta. Para arquivos grandes, percorra csv.reader uma linha por vez, em vez de criar uma lista com o arquivo inteiro. Abrir o arquivo com newline="" permite que o módulo CSV trate as terminações de linha corretamente.

Leia dados de CSV com pandas

Escolha pandas quando rótulos de coluna e operações com tabelas forem úteis. Instale pandas antes de executar este exemplo. pandas.read_csv() usa a primeira linha como nomes das colunas por padrão e retorna um DataFrame com rótulos. Converta os dados em um array com to_numpy() quando uma operação posterior precisar de um array; o próprio DataFrame mantém os rótulos das linhas e das colunas.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

from pathlib import Path
from tempfile import TemporaryDirectory
import pandas as pd

with TemporaryDirectory() as directory:
    path = Path(directory) / "people.csv"
    path.write_text(
        "Name,Age,Occupation\nJohn,28,Engineer\nJane,34,Doctor\n",
        encoding="utf-8",
    )
    frame = pd.read_csv(path)
    data_array = frame.to_numpy()
    print(data_array)

Pandas pode inferir tipos diferentes para colunas distintas do DataFrame. Um único array NumPy precisa ter um só dtype, então converter colunas de tipos mistos pode produzir um array de objetos ou outro dtype comum. Mantenha o DataFrame se os rótulos e as operações por coluna forem importantes; converta apenas quando a etapa seguinte exigir um array como interface.

Trate valores numéricos ausentes com numpy.genfromtxt()

Para tabelas numéricas com campos vazios, use numpy.genfromtxt() e escolha um valor de preenchimento adequado ao cálculo seguinte. Aqui, filling_values=np.nan representa um valor numérico ausente como NaN; o resultado usa valores de ponto flutuante para poder representar esse marcador. É necessário instalar NumPy.

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

from pathlib import Path
from tempfile import TemporaryDirectory
import numpy as np

with TemporaryDirectory() as directory:
    path = Path(directory) / "measurements.csv"
    path.write_text("1,2,3\n4,,6\n7,8,\n", encoding="utf-8")
    data_array = np.genfromtxt(
        path, delimiter=",", filling_values=np.nan
    )
    print(data_array)

Os campos vazios são representados por NaN, que pode ser detectado com as funções isnan do NumPy e tratado antes de cálculos que exigem números comuns. genfromtxt() também oferece suporte à limpeza de entradas mais complexas, mas especifique apenas as opções necessárias para o seu arquivo, para manter claro o comportamento da análise.

Escolha um leitor de CSV adequado aos seus dados

  • Use numpy.loadtxt() para campos numéricos regulares quando o resultado desejado for um array NumPy.
  • Use csv.reader quando quiser linhas de strings e controle sobre a conversão de cada campo. Ele já vem com o Python.
  • Use pandas.read_csv() para tabelas com rótulos e processamento prático por coluna; converta para um array somente quando necessário.
  • Use numpy.genfromtxt() para dados numéricos delimitados com campos ausentes quando um valor de preenchimento escolhido for adequado.

Essas ferramentas não retornam todas o mesmo tipo de objeto. Decida se você precisa de rótulos, campos de texto, operações numéricas com arrays ou tratamento explícito de números ausentes; em seguida, escolha o leitor que produz essa estrutura.