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.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Gravando CSV.
Os objetivos desta aula. 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.
Veja o essencial, parte por parte.
Gravar CSV do jeito básico. Abra o arquivo em modo escrita: open(caminho, 'w', newline='', encoding='utf-8-sig').
DictWriter e o cabeçalho automático. writerow: escreve uma única linha; use dentro de um laço ou para linhas avulsas.
Acentos e o Excel: por que utf-8-sig. Aqui mora uma frustração clássica de quem grava CSV no Brasil.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
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.