HOWTO · Python

Gravar matriz em arquivo CSV em Python

Este tutorial demonstra como salvar a matriz em um arquivo CSV em Python

Nesta página

CSV (valores separados por vírgula) armazena dados tabulares em linhas de texto, o que o torna útil para compartilhar arrays processados com planilhas e outros programas. Escolha NumPy para dados organizados como arrays, Pandas quando já estiver usando um DataFrame e o módulo csv do Python para linhas genéricas e tratamento confiável de aspas e delimitadores. Os exemplos abaixo usam vírgulas como delimitadores e mostram como ler as linhas resultantes.

Gravar um array NumPy em CSV com numpy.savetxt()

numpy.savetxt() grava arrays unidimensionais ou bidimensionais em um arquivo de texto. Passe delimiter="," para separar as colunas com vírgulas; o delimitador padrão é um espaço, que não produz colunas separadas por vírgulas. Para um array numérico unidimensional, use np.savetxt("numbers.csv", data, delimiter=",", fmt="%d") quando valores inteiros em texto forem adequados. Para valores decimais, escolha um formato como "%.2f" para controlar a precisão exibida.

Para dados tabulares com texto e números, crie um array bidimensional, como np.array([["Name", "Age"], ["Ada", 36]]), e passe fmt="%s". Arrays NumPy têm um único tipo de elemento; por isso, ao combinar texto e números, os valores se tornam strings, e o formato os grava como texto. O CSV não preserva os tipos do Python ou do NumPy. Um programa que leia o arquivo precisa interpretar valores como 36 se precisar tratá-los como inteiros.

O NumPy grava cada linha do array como uma linha do CSV. Ele não adiciona nomes de coluna, a menos que você forneça um header; por padrão, o cabeçalho fornecido recebe um marcador de comentário como prefixo. Para que a primeira linha contenha apenas os nomes das colunas, defina header="Name,Age" e comments="".

Gravar um array em CSV com DataFrame.to_csv() do Pandas

Converta dados semelhantes a um array em um DataFrame do Pandas quando quiser nomear as colunas ou já estiver usando o Pandas. Por exemplo, df = pd.DataFrame(data, columns=["Name", "Age"]) atribui nomes às colunas, e df.to_csv("people.csv", index=False) grava os dados. A opção index=False impede que o Pandas adicione os rótulos das linhas como uma coluna extra no início; omita-a somente se esses rótulos precisarem estar no arquivo. Defina header=False se o arquivo de destino não deve incluir nomes de coluna. Consulte a referência de DataFrame.to_csv() para conhecer outras opções de exportação.

Gravar linhas em CSV com csv.writer() do Python

O csv.writer() da biblioteca padrão do Python é uma boa opção geral para linhas com texto, números, vírgulas ou aspas. Abra o arquivo com newline="", crie um gravador e passe as linhas para writerows(). O gravador trata as aspas do CSV quando um valor contém uma vírgula ou aspas. Este exemplo usa apenas a biblioteca padrão e imprime o conteúdo salvo no arquivo para mostrar as linhas e o comportamento do delimitador:

Execute este exemplo:

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

import csv
from pathlib import Path
from tempfile import TemporaryDirectory

rows = [[1, 4, 2], [7, 9, 4], [0, 6, 2]]
with TemporaryDirectory() as directory:
    path = Path(directory) / "numbers.csv"
    with path.open("w", newline="", encoding="utf-8") as file:
        writer = csv.writer(file)
        writer.writerows(rows)
    print(path.read_text(encoding="utf-8"), end="")
1,4,2
7,9,4
0,6,2

Para entradas grandes, writerows() aceita um iterável de linhas, então não é necessário montar todo o conjunto de dados em outra lista. O arquivo é fechado quando o bloco with termina.

Ler um arquivo CSV com csv.reader()

csv.reader() lê o arquivo e fornece cada linha como uma lista de strings. Ele é um leitor, não um objeto gravador. Por exemplo, uma célula gravada como 36 é lida como a string "36"; converta-a com int() ou float() quando precisar fazer operações numéricas. Ao abrir arquivos de texto para leitura de CSV, use também newline="". Se o arquivo tiver cabeçalho, trate a primeira linha separadamente, por exemplo, chamando next(reader) antes de processar as linhas de dados. O leitor também interpreta delimitadores entre aspas, ao contrário de dividir cada linha pelas vírgulas.

Gravar linhas simples com manipulação de arquivos no Python

A manipulação direta de arquivos é adequada para valores simples e controlados que não contenham vírgulas, aspas ou quebras de linha. Converta cada valor em texto, junte os valores de uma linha com vírgulas e termine-a com uma quebra de linha — por exemplo, file.write(",".join(map(str, row)) + "\n"). Essa é uma formatação manual de texto, não um serializador CSV genérico: um nome como "Doe, Jane" seria dividido em duas colunas. Use csv.writer() para dados arbitrários, pois ele trata corretamente aspas e delimitadores. Ao abrir um arquivo para gravar CSV, use newline="" e escolha uma codificação explícita, como UTF-8, se o arquivo contiver caracteres fora do ASCII.