Planilhas e bancos de dados costumam ser exportados para um formato chamado CSV (Comma-Separated Values). É um arquivo de texto simples onde cada linha é um registro e cada coluna é separada por vírgula:
nome,idade,cidade
Maria,28,Sao Marcos
Joao,35,Espirito Santo do Pinhal
Ana,22,Casa Branca
Apesar de simples, o CSV está em todo lugar: relatórios financeiros, listas de clientes, dados de sensores, exportações de sistemas. E o Python tem um módulo nativo chamado csv que facilita (e muito) o trabalho com esses arquivos.
Lendo um arquivo CSV
Para ler, usamos a função csv.reader. Cada linha vira uma lista de valores:
import csv
with open("dados.csv", newline="", encoding="utf-8") as arquivo:
leitor = csv.reader(arquivo)
for linha in leitor:
print(linha)
Resultado:
['nome', 'idade', 'cidade']
['Maria', '28', 'Sao Marcos']
['Joao', '35', 'Espirito Santo do Pinhal']
O newline="" é importante para evitar linhas em branco indesejadas entre os registros, um problema clássico de quem usa CSV no Python.
Usando dicionários: csv.DictReader
Trabalhar com listas é confuso quando a planilha tem muitas colunas. O csv.DictReader resolve isso transformando cada linha em um dicionário, usando a primeira linha como nome das colunas:
import csv
with open("dados.csv", newline="", encoding="utf-8") as arquivo:
leitor = csv.DictReader(arquivo)
for linha in leitor:
print(linha["nome"], "-", linha["cidade"])
Agora acessamos cada valor pelo nome da coluna, o que torna o código muito mais legível e seguro.
Filtrando dados
Com dicionários, filtrar fica natural. Vamos listar apenas os registros de pessoas com mais de 25 anos:
import csv
with open("dados.csv", newline="", encoding="utf-8") as arquivo:
leitor = csv.DictReader(arquivo)
for linha in leitor:
if int(linha["idade"]) > 25:
print(linha["nome"])
Repare no int(linha["idade"]): tudo que vem de um CSV é texto, então precisamos converter para número antes de comparar.
Escrevendo um CSV
Para gerar um arquivo, usamos csv.writer:
import csv
cabecalho = ["nome", "idade", "cidade"]
registros = [
["Maria", 28, "Sao Marcos"],
["Joao", 35, "Espirito Santo do Pinhal"],
]
with open("saida.csv", "w", newline="", encoding="utf-8") as arquivo:
escritor = csv.writer(arquivo)
escritor.writerow(cabecalho) # uma linha
escritor.writerows(registros) # varias linhas de uma vez
O csv.writer cuida de tudo para você: coloca as vírgulas, escapa valores que contenham vírgula ou aspas e usa quebra de linha corretamente.
Escrevendo com dicionários: csv.DictWriter
De forma análoga, o csv.DictWriter grava listas de dicionários. A vantagem é que ele só escreve as colunas que você definir em fieldnames:
import csv
cabecalho = ["nome", "idade", "cidade"]
registros = [
{"nome": "Maria", "idade": 28, "cidade": "Sao Marcos"},
{"nome": "Joao", "idade": 35, "cidade": "Espirito Santo do Pinhal"},
]
with open("saida.csv", "w", newline="", encoding="utf-8") as arquivo:
escritor = csv.DictWriter(arquivo, fieldnames=cabecalho)
escritor.writeheader()
escritor.writerows(registros)
O writeheader() grava a primeira linha com os nomes das colunas automaticamente.
Delimitadores diferentes
Nem todo CSV usa vírgula. No Brasil é comum encontrar arquivos separados por ponto e vírgula (;), porque a vírgula é usada como separador decimal. Basta informar o delimitador:
with open("dados_br.csv", newline="", encoding="utf-8") as arquivo:
leitor = csv.DictReader(arquivo, delimiter=";")
for linha in leitor:
print(linha)
Se o arquivo estiver com texto corrompido, lembre-se do encoding="utf-8" e, se necessário, encoding="latin-1".
Exemplo completo: relatório de vendas
Vamos juntar tudo: ler uma planilha de vendas, calcular o total por vendedor e salvar um resumo:
import csv
total_por_vendedor = {}
with open("vendas.csv", newline="", encoding="utf-8") as arquivo:
leitor = csv.DictReader(arquivo)
for linha in leitor:
vendedor = linha["vendedor"]
valor = float(linha["valor"])
total_por_vendedor[vendedor] = total_por_vendedor.get(vendedor, 0.0) + valor
with open("resumo_vendas.csv", "w", newline="", encoding="utf-8") as arquivo:
escritor = csv.writer(arquivo)
escritor.writerow(["vendedor", "total"])
for vendedor, total in total_por_vendedor.items():
escritor.writerow([vendedor, f"{total:.2f}"])
print("Resumo gerado!")
Em poucas linhas: lemos os dados, agrupamos por vendedor e geramos um novo arquivo pronto para ser aberto em qualquer planilha.
E se eu precisar de arquivos .xlsx?
O módulo csv trabalha com texto puro. Para planilhas Excel nativas (.xlsx), o formato é outro e usamos bibliotecas como openpyxl ou pandas. É um bom assunto para um próximo artigo de dados.
Resumo
O módulo csv resolve a grande maioria dos casos de leitura e escrita de tabelas:
csv.readerecsv.writerpara trabalhar com listas;csv.DictReaderecsv.DictWriterpara trabalhar com dicionários;- Sempre use
newline=""eencoding="utf-8"; - Atenção ao delimitador (
delimiter=";").
Com isso você pode automatizar a troca de dados entre sistemas, gerar relatórios e alimentar análises — tudo com a biblioteca padrão do Python.
Usou o CSV em alguma automação interessante? Conta pra gente nos comentários ou contribua com um artigo no nosso repositório.