HOWTO · Pandas
Como acrescentar dados a um ficheiro CSV com Pandas
Este tutorial demonstra como adicionar dados a um ficheiro CSV existente usando to_csv() em modo anexo
Nesta página
Use Pandas to_csv() com mode="a" para acrescentar linhas de um DataFrame às linhas já existentes num ficheiro CSV. O modo de anexação preserva o conteúdo do ficheiro. Defina header=False quando o ficheiro já tiver um cabeçalho e index=False quando não quiser que o índice do DataFrame se torne uma coluna CSV adicional.
Acrescentar um DataFrame a um ficheiro CSV existente
Este exemplo cria um ficheiro CSV inicial e acrescenta-lhe um segundo DataFrame. No seu próprio código, use o caminho do seu ficheiro CSV. Mantenha as colunas acrescentadas pela mesma ordem das colunas do CSV existente: os ficheiros CSV não armazenam um esquema que reorganize automaticamente os valores pelo nome das colunas.
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 pandas as pd
with TemporaryDirectory() as directory:
path = Path(directory) / "records.csv"
original = pd.DataFrame({"name": ["Ava"], "score": [8]})
added = pd.DataFrame({"name": ["Noah"], "score": [9]})
original.to_csv(path, index=False)
added.to_csv(path, mode="a", header=False, index=False)
print(path.read_text(), end="")
A primeira escrita cria o ficheiro e o respetivo cabeçalho. A segunda usa mode="a" para acrescentar uma linha no fim, com header=False para não repetir os nomes das colunas e index=False para impedir que o Pandas adicione o índice da linha. O ficheiro final contém a linha original seguida da linha acrescentada. Se quiser incluir o índice do DataFrame como coluna, omita index=False e tenha essa coluna adicional em conta ao ler o CSV.
Escrever o cabeçalho apenas quando o ficheiro CSV está vazio
Quando o destino pode estar vazio ou ainda não existir, abra-o em modo de anexação e verifique a posição atual no ficheiro. Abrir um caminho inexistente com mode="a" cria o ficheiro. A chamada tell() indica a posição atual; imediatamente após abrir em modo de anexação, uma posição de 0 significa que o ficheiro está vazio. Escreva o cabeçalho apenas nesse caso.
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) / "records.csv"
rows = pd.DataFrame({"name": ["Mia"], "score": [7]})
with path.open("a", encoding="utf-8", newline="") as csv_file:
write_header = csv_file.tell() == 0
rows.to_csv(csv_file, header=write_header, index=False)
Isto funciona tanto com um ficheiro novo como com um CSV existente: um ficheiro recém-criado ou vazio recebe os nomes das colunas, enquanto um ficheiro com conteúdo recebe apenas a nova linha. Use a mesma ordem de colunas e campos compatíveis sempre que acrescentar dados. Os nomes das colunas usados no exemplo permanecem em inglês no código. Se o seu programa tiver vários processos que possam atualizar o mesmo ficheiro em simultâneo, coordene as escritas para impedir que a verificação do cabeçalho e a escrita da linha se intercalem com as operações de outro processo.
Verificar as linhas acrescentadas e evitar erros comuns
Leia o CSV depois de escrever quando precisar de confirmar o conteúdo. No primeiro exemplo, o ficheiro tem um cabeçalho seguido dos registos original e acrescentado. A instrução print(path.read_text(), end="") apresenta o conteúdo exato do ficheiro como texto selecionável quando executar o exemplo. Os valores e nomes de colunas apresentados pelo código permanecem em inglês.
Ao adaptar os exemplos, verifique estes detalhes:
- As colunas do DataFrame acrescentado têm de corresponder às colunas do CSV e estar pela mesma ordem. O Pandas escreve os valores pela posição; durante a anexação, não associa as colunas do CSV pelos respetivos nomes.
- Use
header=Falsenum ficheiro não vazio que já tenha cabeçalho. Um cabeçalho repetido seria lido como uma linha de dados normal. - Escolha
index=Falsese o índice das linhas não fizer parte dos seus dados. Caso contrário, inclua a coluna do índice na estrutura do ficheiro e tenha-a em conta. - O modo de anexação acrescenta texto ao fim do ficheiro; não valida nem corrige colunas, delimitadores ou codificações incompatíveis. Mantenha essas definições consistentes com o CSV existente.
- Se o ficheiro estiver vazio, escreva o cabeçalho uma vez antes da primeira linha de dados. A verificação com
tell()acima usa a posição do ficheiro aberto em modo de anexação para decidir se deve escrever o cabeçalho.
Para uma verificação rápida em Python, carregue o ficheiro resultante com pd.read_csv(path) e inspecione as linhas e os nomes das colunas. Assim, verifica a tabela analisada e também o texto escrito no disco.