HOWTO · NumPy
Escreva NumPy Array para CSV em Python
Este tutorial demonstra como salvar um array numpy em um arquivo csv
Nesta página
Use numpy.savetxt() para gravar um array NumPy numérico como texto separado por vírgulas. Escolha pandas quando o array fizer parte de um fluxo de trabalho com DataFrame, ou csv.writer quando precisar criar ou personalizar linhas. Como o CSV armazena linhas e colunas, decida como um array unidimensional ou de dimensões maiores deve ser distribuído nessas linhas antes de salvá-lo.
Os exemplos usam um pequeno array bidimensional com valores inteiros. Todos gravam apenas os valores, sem cabeçalho nem índice. NumPy é necessário para os exemplos com arrays; pandas é um pacote adicional, necessário apenas para a seção correspondente. O código e a saída dos exemplos permanecem em inglês, inclusive os rótulos visíveis.
Escolha o método conforme o array e a saída desejada
Para um array numérico e um arquivo de texto simples com delimitadores, numpy.savetxt() é uma opção padrão direta. delimiter define o separador, e fmt determina como cada valor é representado. Use pandas se já precisar de operações com DataFrame ou de rótulos de coluna. Use csv.writer se as linhas exigirem processamento personalizado ou se precisar das regras de citação de CSV do Python. O gravador integrado trata vírgulas e aspas nos campos com mais segurança do que concatenar valores em strings manualmente.
O savetxt trata um array unidimensional como um vetor coluna e grava um valor por linha. Para gravar esses valores lado a lado em uma única linha CSV, redimensione o array para (1, -1) antes de salvá-lo. O laço com csv.writer abaixo pressupõe um array bidimensional: cada row percorrida é iterável. Para uma entrada unidimensional, use writer.writerow(data) para gravar uma linha ou percorra os valores e chame writer.writerow([value]) para gravar um valor por linha. Um arquivo CSV não tem representação nativa para três dimensões. Redimensione um array 3D para linhas e colunas ou achate-o, escolhendo uma ordem que o leitor consiga reconstruir. Não deixe que o achatamento determine silenciosamente a disposição dos dados.
Salve um array NumPy com numpy.savetxt()
O formato '%d' é adequado para os valores inteiros mostrados. Para dados de ponto flutuante, escolha um formato como '%.3f' quando três casas decimais forem suficientes; a formatação pode arredondar valores, então selecione uma precisão que preserve os dados de que precisa. Se a ferramenta que receberá o arquivo esperar outro separador, como ';' ou '\t', passe-o em delimiter.
Execute este exemplo. O código e a saída exibidos permanecem em inglês, inclusive os rótulos visíveis.
from pathlib import Path
from tempfile import TemporaryDirectory
import numpy as np
data = np.array([[1, 2, 3], [4, 5, 6]])
with TemporaryDirectory() as directory:
path = Path(directory) / "array.csv"
np.savetxt(path, data, delimiter=",", fmt="%d")
print(path.read_text(), end="")
1,2,3
4,5,6
Salve um array NumPy com pandas
Converta o array em um DataFrame e depois chame to_csv(). Por padrão, pandas grava o índice do DataFrame e os nomes das colunas; defina index=False e header=False quando o arquivo deva conter apenas os valores do array. Mantenha ou forneça esses campos quando eles forem rótulos úteis para quem receberá o arquivo. O código e a saída exibidos permanecem em inglês, inclusive os rótulos visíveis.
from pathlib import Path
from tempfile import TemporaryDirectory
import numpy as np
import pandas as pd
data = np.array([[1, 2, 3], [4, 5, 6]])
with TemporaryDirectory() as directory:
path = Path(directory) / "array.csv"
pd.DataFrame(data).to_csv(path, index=False, header=False)
print(path.read_text(), end="")
1,2,3
4,5,6
Grave linhas com o módulo csv do Python
csv.writer grava cada linha iterável e escapa os campos quando a sintaxe CSV exige. Abra o arquivo com newline=""; assim, o módulo CSV gerencia os caracteres de nova linha e evita linhas em branco extras em plataformas que traduzem esses caracteres. O exemplo a seguir usa diretamente as linhas do array. O código e a saída exibidos permanecem em inglês, inclusive os rótulos visíveis.
from pathlib import Path
from tempfile import TemporaryDirectory
import csv
import numpy as np
data = np.array([[1, 2, 3], [4, 5, 6]])
with TemporaryDirectory() as directory:
path = Path(directory) / "array.csv"
with path.open("w", newline="", encoding="utf-8") as file:
writer = csv.writer(file)
for row in data:
writer.writerow(row)
print(path.read_text(), end="")
1,2,3
4,5,6
Para acrescentar linhas, abra o destino no modo de acréscimo ("a") e grave apenas as linhas novas. Confira se a ordem e a quantidade de colunas correspondem às do arquivo existente; o modo de acréscimo não valida os dados nem adiciona um cabeçalho. Para uma entrada unidimensional, escolha se ela representa uma linha ou um valor por linha e ajuste a forma ou envolva os valores de acordo com essa escolha.
Entenda as limitações de ndarray.tofile()
ndarray.tofile() é um método de array, mas não é um gravador CSV. Ele grava os elementos do array na ordem achatada e não preserva a forma original nem a estrutura de linhas e colunas. Um separador de vírgula pode produzir texto delimitado, mas o arquivo ainda não informa ao leitor quais eram as dimensões originais. A representação da saída também depende do formato escolhido; uma única linha, por si só, não significa que houve perda de precisão numérica. Prefira savetxt, pandas ou csv.writer quando precisar de um layout CSV explícito.
Grave texto CSV manualmente apenas para dados simples
Para um array bidimensional pequeno e conhecido, com valores numéricos simples, a formatação de strings do Python pode criar linhas diretamente. Essa abordagem pressupõe que a forma e os valores sejam adequados para texto simples. Construir o resultado inteiro com join usa memória proporcional ao tamanho da saída, e a concatenação manual não trata valores com vírgulas, aspas ou quebras de linha de acordo com as regras CSV. Use csv.writer para dados gerais ou campos de texto. O código e a saída exibidos permanecem em inglês, inclusive os rótulos visíveis.
from pathlib import Path
from tempfile import TemporaryDirectory
data = [[1, 2, 3], [4, 5, 6]]
with TemporaryDirectory() as directory:
path = Path(directory) / "array.csv"
content = "\n".join(",".join(str(value) for value in row) for row in data)
path.write_text(content + "\n", encoding="utf-8")
print(path.read_text(), end="")
1,2,3
4,5,6