Módulo 8 - Arquivos CSV e pathlib

Gravando CSV

11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026

O que você vai aprender

  • Gravar linhas em CSV com csv.writer e o método writerow.
  • Escrever a partir de dicionários com csv.DictWriter e writeheader.
  • Despejar várias linhas de uma vez com writerows.
  • Usar utf-8-sig para que o Excel abra o CSV com acentos corretos.

Gravar CSV do jeito básico

Gravar CSV segue a mesma lógica de ler, ao contrário. Você abre o arquivo em modo de escrita, com o 'w' como segundo argumento, cria um escritor em cima dele e chama métodos para despejar as linhas. O modo 'w' cria o arquivo se ele não existe e apaga o conteúdo se ele já existe, então tome cuidado para não sobrescrever algo importante. O newline='' continua obrigatório, pela mesma razão da leitura. Veja a forma mais direta, com csv.writer, que recebe cada linha como uma lista.

import csv

linhas = [
    ["nome", "nota", "cidade"],
    ["Ana", 9.5, "Recife"],
    ["Bruno", 7.0, "Salvador"],
]

with open("saida.csv", "w", newline="", encoding="utf-8-sig") as arquivo:
    escritor = csv.writer(arquivo)
    for linha in linhas:
        escritor.writerow(linha)

print("Arquivo gravado.")  # Arquivo gravado.

csv.writer grava listas; cada writerow escreve uma linha do arquivo.

O método writerow escreve uma linha por vez, cuidando de juntar os campos com vírgula e de colocar aspas quando um valor tem vírgula ou quebra de linha dentro. Note que aqui os números não precisam virar texto na mão: o writer converte 9.5 para o texto certo no arquivo. Se você tem uma lista de listas pronta, dá para gravar todas de uma vez com writerows, sem o laço, como você vê mais adiante. O resultado é um CSV que qualquer planilha abre.

DictWriter e o cabeçalho automático

Quando seus dados já estão em dicionários, o que é comum depois de ler com DictReader ou de montar registros no programa, o csv.DictWriter é o par ideal. Você informa os nomes das colunas em fieldnames, chama writeheader uma vez para escrever a primeira linha com esses nomes, e depois passa cada dicionário para writerow. O DictWriter garante que cada campo caia na coluna certa pelo nome, mesmo que os dicionários estejam em ordem diferente.

import csv

registros = [
    {"nome": "Ana", "nota": 9.5, "cidade": "Recife"},
    {"nome": "Bruno", "nota": 7.0, "cidade": "Salvador"},
]

colunas = ["nome", "nota", "cidade"]

with open("saida.csv", "w", newline="", encoding="utf-8-sig") as arquivo:
    escritor = csv.DictWriter(arquivo, fieldnames=colunas)
    escritor.writeheader()
    escritor.writerows(registros)

print("Gravado com cabecalho.")  # Gravado com cabecalho.

DictWriter: fieldnames define as colunas, writeheader escreve o cabeçalho, writerows grava tudo.

Duas coisas se destacam. O writeheader escreve automaticamente nome,nota,cidade como primeira linha, usando exatamente os fieldnames que você definiu, sem precisar digitar o cabeçalho de novo. E o writerows recebe a lista inteira de dicionários e grava todos de uma vez, mais enxuto que um laço com writerow. Se um dicionário tiver uma chave a mais que não está em fieldnames, o DictWriter avisa com erro, o que ajuda a pegar campos digitados errado. Esse é o padrão que fecha o relatório do fim do módulo.

Acentos e o Excel: por que utf-8-sig

Aqui mora uma frustração clássica de quem grava CSV no Brasil. Você salva um arquivo com utf-8, abre no Excel em português e os acentos viram símbolos estranhos: São Paulo aparece como algo ilegível. O problema não é o Python, é o Excel: ele, por padrão, não assume utf-8 ao abrir CSV. A solução é gravar com encoding='utf-8-sig'. O sufixo sig adiciona uma marca invisível no início do arquivo, o BOM, que o Excel reconhece e então mostra os acentos corretamente.

encoding='utf-8'

  • Padrão para ler e para a maioria dos usos
  • Excel em português pode mostrar acento errado
  • Sem marca no início do arquivo
  • Ótimo quando o consumidor é outro programa

encoding='utf-8-sig'

  • Mesmo utf-8 com uma marca (BOM) no início
  • Excel reconhece e mostra acento correto
  • Recomendado quando um humano abrirá no Excel
  • Um pouco maior por causa da marca invisível

A regra prática é simples. Se o CSV que você grava vai ser aberto por uma pessoa no Excel em português, use utf-8-sig e evite a dor de cabeça dos acentos. Se ele vai ser lido por outro programa, ou pelo próprio Python, o utf-8 comum basta e é o mais limpo. Nas duas situações, na leitura você continua usando utf-8, que entende o arquivo com ou sem a marca. É um detalhe pequeno, mas é a diferença entre um relatório que abre bonito e um que abre bagunçado.

Teste rápido

Por que gravar um CSV com encoding='utf-8-sig' quando ele será aberto no Excel em português?

Perguntas frequentes

O modo 'w' apaga o que já existe no arquivo?
Sim. Abrir com 'w' cria o arquivo se ele não existe e zera o conteúdo se ele já existe. Para acrescentar linhas ao fim sem apagar, use o modo 'a', de append. Tome cuidado ao gravar por cima de um arquivo que você não quer perder.
Preciso converter os números para texto antes de gravar?
Não. O csv.writer e o DictWriter convertem os valores para texto ao escrever, então você pode passar 9.5 ou 42 diretamente. Isso é diferente da leitura, em que tudo volta como texto e você é quem converte para número quando precisa calcular.
Qual a diferença entre writerow e writerows?
writerow, no singular, grava uma única linha por chamada. writerows, no plural, recebe uma lista de linhas e grava todas de uma vez. Use writerows quando já tem a coleção pronta; use writerow dentro de um laço quando gera as linhas uma a uma.
Sempre devo usar utf-8-sig ao gravar?
Não. Use utf-8-sig quando uma pessoa vai abrir o CSV no Excel em português, para os acentos saírem certos. Se o arquivo será lido por outro programa ou pelo próprio Python, o utf-8 comum é mais limpo. Na leitura, utf-8 entende os dois casos.
O DictWriter escreve o cabeçalho sozinho?
Só se você chamar writeheader. Você define as colunas em fieldnames ao criar o DictWriter e, então, writeheader escreve a linha de cabeçalho com esses nomes. Se esquecer de chamar writeheader, o arquivo sai sem cabeçalho, só com os dados.
Preciso do newline='' também para gravar?
Sim, do mesmo jeito que na leitura. Sem newline='', o módulo csv e o sistema podem inserir linhas em branco extras entre os registros, especialmente no Windows. Passar newline='' entrega o controle das quebras ao módulo csv, que é o recomendado.

Fontes

Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.