✅ Artigo atualizado em Setembro 2026 Adicionamos as seções que a introdução prometia e o corpo não tinha:
DictReader/DictWriter,delimiterequotecharpara CSV brasileiro com ponto e vírgula ecsv.Sniffer. Todos os exemplos agora abrem os arquivos comencoding="utf-8"enewline=""e mostram a saída real (testados no Python 3.10 e 3.13).
Salve salve Pythonista 👋
Biblioteca csv é nativa do Python - perfeita para arquivos simples sem precisar de pandas!
Neste guia:
- ✅ DictReader/Writer - Trabalhar com dicionários
- ✅ Dialetos - delimiter, quotechar (CSV com ponto e vírgula)
- ✅ csv.Sniffer - Detectar o formato automaticamente
- ✅ Casos práticos - Filtrar, transformar
- ✅ csv vs pandas - Quando usar cada um
Neste artigo, iremos explorar a manipulação de arquivos CSV (Comma Separated Values) usando a linguagem de programação Python.
Os arquivos CSV são amplamente utilizados para armazenar dados tabulares de forma simples e eficiente.
Portanto, é essencial que programadores Python tenham conhecimento sobre como manipulá-los.
Vá Direto ao Assunto…
- Por que aprender a manipular arquivos CSV com Python?
- Lendo arquivos CSV
- Manipulando dados CSV
- Escrevendo em arquivos CSV
- Lendo e escrevendo com DictReader e DictWriter
- Dialetos: delimiter e quotechar (CSV brasileiro)
- Detectando o formato com csv.Sniffer
- csv vs pandas
Por que aprender a manipular arquivos CSV com Python?
A manipulação de arquivos CSV é uma tarefa comum para programadores Python em vários domínios, como processamento de dados, análise de dados, geração de relatórios e muito mais.
É importante saber como ler, escrever e manipular arquivos CSV usando Python, pois isso permite automatizar várias tarefas e processar grandes quantidades de dados de forma eficiente.
Lendo arquivos CSV
Vamos começar aprendendo a ler arquivos CSV usando Python.
Para isso, usaremos o módulo csv que já vem embutido na biblioteca padrão do Python.
O módulo csv nos fornece várias funcionalidades para trabalhar com arquivos CSV de forma fácil e eficiente.
Para ler um arquivo CSV, primeiro precisamos abrir o arquivo usando a função open.
Em seguida, usaremos o objeto de arquivo retornado para criar um leitor de CSV usando a função csv.reader.
Nos exemplos de leitura, vamos usar um arquivo dados.csv com este conteúdo (é o mesmo arquivo que vamos gerar na seção Escrevendo em arquivos CSV):
1
2
3
4
Nome,Idade,País
João,25,Brasil
Maria,30,Portugal
José,35,Espanha
O exemplo a seguir demonstra como ler esse arquivo:
1
2
3
4
5
6
import csv
with open('dados.csv', 'r', encoding='utf-8', newline='') as arquivo:
leitor_csv = csv.reader(arquivo)
for linha in leitor_csv:
print(linha)
Neste exemplo, usamos um with statement para garantir que o arquivo seja fechado corretamente após o uso.
Passamos também dois parâmetros importantes para o open:
-
encoding='utf-8': define a codificação do texto. Sem ele, o Python usa a codificação padrão do sistema (no Windows em português costuma sercp1252) e nomes como “João” podem virar “João” ou gerarUnicodeDecodeError. -
newline='': a documentação do módulocsvrecomenda abrir o arquivo assim tanto para ler quanto para escrever, porque o próprio módulocsvcuida das quebras de linha. Sem isso, quebras de linha dentro de campos entre aspas não são interpretadas corretamente.
Em seguida, criamos um leitor de CSV usando o objeto de arquivo retornado pela função open.
Por fim, iteramos sobre as linhas do arquivo usando um loop for e imprimimos cada linha. Cada linha vem como uma lista de strings:
1
2
3
4
['Nome', 'Idade', 'País']
['João', '25', 'Brasil']
['Maria', '30', 'Portugal']
['José', '35', 'Espanha']
Está curtindo esse conteúdo? ![]()
Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?
Manipulando dados CSV
Agora que sabemos como ler um arquivo CSV, vamos aprender como manipular os dados contidos nele.
A manipulação de dados CSV envolve várias tarefas, como filtrar linhas, selecionar colunas específicas e calcular estatísticas.
O exemplo a seguir demonstra como filtrar linhas em um arquivo CSV:
1
2
3
4
5
6
7
8
import csv
with open('dados.csv', 'r', encoding='utf-8', newline='') as arquivo:
leitor_csv = csv.reader(arquivo)
next(leitor_csv) # pula a primeira linha (cabeçalho)
for linha in leitor_csv:
if linha[2] == 'Brasil':
print(linha)
Neste exemplo, usamos a função next para pular a primeira linha do arquivo, que geralmente contém o cabeçalho.
Em seguida, verificamos se o valor da terceira coluna (índice 2) é igual a “Brasil” e, se for, imprimimos a linha:
1
['João', '25', 'Brasil']
Dessa forma, filtramos apenas as linhas que atendem a essa condição.
Além disso, podemos selecionar colunas específicas em um arquivo CSV usando a indexação adequada.
O exemplo a seguir ilustra como selecionar apenas as colunas 1 e 3 de um arquivo CSV:
1
2
3
4
5
6
import csv
with open('dados.csv', 'r', encoding='utf-8', newline='') as arquivo:
leitor_csv = csv.reader(arquivo)
for linha in leitor_csv:
print(linha[0], linha[2])
Neste exemplo, imprimimos apenas as colunas 1 e 3 de cada linha do arquivo:
1
2
3
4
Nome País
João Brasil
Maria Portugal
José Espanha
As colunas são indexadas a partir de zero, então a primeira coluna é representada pelo índice 0, a segunda coluna pelo índice 1 e assim por diante.
Criei o Ebookr.ai, uma plataforma que usa IA para gerar ebooks profissionais sobre qualquer tema - com capa gerada por IA, infográficos automáticos e exportação em PDF. Confere!
Escrevendo em arquivos CSV
Além de ler dados de um arquivo CSV, também podemos escrever dados em um arquivo CSV usando Python.
Para escrever em um arquivo CSV, usamos a função csv.writer juntamente com o objeto de arquivo retornado pela função open.
O exemplo a seguir demonstra como escrever dados em um arquivo CSV:
1
2
3
4
5
6
7
8
9
10
11
12
13
import csv
dados = [
['Nome', 'Idade', 'País'],
['João', '25', 'Brasil'],
['Maria', '30', 'Portugal'],
['José', '35', 'Espanha']
]
with open('dados.csv', 'w', encoding='utf-8', newline='') as arquivo:
escritor_csv = csv.writer(arquivo)
for linha in dados:
escritor_csv.writerow(linha)
Neste exemplo, criamos uma lista de listas chamada dados, onde cada lista representa uma linha do CSV.
Em seguida, abrimos o arquivo dados.csv em modo de escrita, usando a opção w, com encoding='utf-8' para gravar os acentos corretamente.
O parâmetro newline='' é essencial na escrita: o csv.writer já termina cada linha com \r\n (o padrão do formato CSV). Sem newline='', no Windows o Python converteria esse \n de novo e o arquivo ganharia um \r extra em cada linha (\r\r\n), o que costuma aparecer como uma linha em branco entre cada registro.
Por fim, usamos um loop for para escrever cada linha do dados no arquivo CSV usando a função writerow do objeto escritor de CSV. Se preferir, escritor_csv.writerows(dados) escreve todas as linhas de uma vez.
O resultado é exatamente o arquivo dados.csv que usamos nos exemplos de leitura.
Lendo e escrevendo com DictReader e DictWriter
Acessar colunas por índice (linha[2]) funciona, mas fica difícil de ler e quebra se a ordem das colunas mudar.
O csv.DictReader resolve isso: ele usa a primeira linha como cabeçalho e entrega cada linha como um dicionário, com o nome da coluna como chave:
1
2
3
4
5
6
import csv
with open('dados.csv', 'r', encoding='utf-8', newline='') as arquivo:
leitor = csv.DictReader(arquivo)
for linha in leitor:
print(linha['Nome'], '-', linha['País'])
Saída:
1
2
3
João - Brasil
Maria - Portugal
José - Espanha
O caminho inverso é o csv.DictWriter: você informa a lista de colunas em fieldnames, escreve o cabeçalho com writeheader() e depois passa dicionários para writerow() (um por vez) ou writerows() (vários de uma vez):
1
2
3
4
5
6
7
8
9
10
11
import csv
pessoas = [
{'Nome': 'Ana', 'Idade': 28, 'País': 'Brasil'},
{'Nome': 'Pedro', 'Idade': 41, 'País': 'Angola'},
]
with open('pessoas.csv', 'w', encoding='utf-8', newline='') as arquivo:
escritor = csv.DictWriter(arquivo, fieldnames=['Nome', 'Idade', 'País'])
escritor.writeheader() # escreve a linha de cabeçalho
escritor.writerows(pessoas) # escreve todas as linhas de uma vez
O arquivo pessoas.csv gerado fica assim (os números são convertidos para texto automaticamente):
1
2
3
Nome,Idade,País
Ana,28,Brasil
Pedro,41,Angola
Se um dicionário tiver uma chave que não está em fieldnames, o DictWriter lança ValueError (comportamento padrão de extrasaction='raise'); chaves ausentes são preenchidas com string vazia (restval='').
Ajustar delimitador e aspas em CSVs brasileiros é o tipo de detalhe que aparece direto em automação de planilhas - um dos projetos que você constrói na Jornada Python:
Dialetos: delimiter e quotechar (CSV brasileiro)
Muitos arquivos CSV brasileiros não usam vírgula para separar colunas, e sim ponto e vírgula. O motivo: a vírgula já é o separador decimal (12,50). É o formato que o Excel em português gera ao salvar como CSV, por exemplo.
Os parâmetros que controlam isso (o “dialeto” do CSV) são:
-
delimiter: o caractere que separa as colunas (padrão',') -
quotechar: o caractere usado para envolver campos que contêm o delimitador, aspas ou quebras de linha (padrão'"')
Veja como escrever um CSV com ponto e vírgula:
1
2
3
4
5
6
7
8
9
10
11
import csv
produtos = [
['produto', 'preço', 'descrição'],
['Café', '12,50', 'Torrado; moído'],
['Pão de queijo', '7,90', 'Receita "da vó"'],
]
with open('produtos_br.csv', 'w', encoding='utf-8', newline='') as arquivo:
escritor = csv.writer(arquivo, delimiter=';', quotechar='"')
escritor.writerows(produtos)
O arquivo gerado:
1
2
3
produto;preço;descrição
Café;12,50;"Torrado; moído"
Pão de queijo;7,90;"Receita ""da vó"""
Repare que o módulo csv colocou entre aspas os campos que contêm ; (senão eles seriam quebrados em duas colunas) e duplicou as aspas que já existiam dentro do texto. Você não precisa fazer nada disso na mão.
Para ler, basta passar o mesmo delimiter (e quotechar, se for diferente do padrão). Aqui aproveitamos para transformar o preço brasileiro em float:
1
2
3
4
5
6
7
import csv
with open('produtos_br.csv', 'r', encoding='utf-8', newline='') as arquivo:
leitor = csv.DictReader(arquivo, delimiter=';', quotechar='"')
for linha in leitor:
preco = float(linha['preço'].replace(',', '.'))
print(linha['produto'], preco, linha['descrição'])
Saída:
1
2
Café 12.5 Torrado; moído
Pão de queijo 7.9 Receita "da vó"
Arquivos exportados por sistemas antigos ou pelo Excel no Windows muitas vezes vêm em
cp1252/latin-1em vez de UTF-8. Se aparecerUnicodeDecodeError, troque oencodingdoopenpara'cp1252'.
Detectando o formato com csv.Sniffer
Quando você recebe um CSV e não sabe qual é o separador, o csv.Sniffer pode tentar descobrir o dialeto analisando um trecho do arquivo.
Suponha um arquivo estoque.csv com este conteúdo:
1
2
3
4
produto;preço;quantidade
Café;12,50;10
Pão de queijo;7,90;25
Açúcar;4,25;3
Podemos detectar o delimitador e se há cabeçalho assim:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import csv
with open('estoque.csv', 'r', encoding='utf-8', newline='') as arquivo:
amostra = arquivo.read(1024) # lê um pedaço do arquivo para análise
arquivo.seek(0) # volta ao início antes de ler de verdade
try:
dialeto = csv.Sniffer().sniff(amostra, delimiters=',;\t')
except csv.Error:
dialeto = csv.excel # não deu para detectar: assume o padrão (vírgula)
print('Delimitador:', repr(dialeto.delimiter))
print('Tem cabeçalho?', csv.Sniffer().has_header(amostra))
for linha in csv.reader(arquivo, dialeto):
print(linha)
Saída:
1
2
3
4
5
6
Delimitador: ';'
Tem cabeçalho? True
['produto', 'preço', 'quantidade']
['Café', '12,50', '10']
['Pão de queijo', '7,90', '25']
['Açúcar', '4,25', '3']
Alguns cuidados:
- O
sniff()é uma heurística e pode errar ou lançarcsv.Error(“Could not determine delimiter”), principalmente com amostras pequenas ou campos entre aspas. Por isso usamostry/exceptcom um dialeto padrão. - O parâmetro
delimiterslimita os candidatos (aqui vírgula, ponto e vírgula e tab). Sem ele, o Sniffer pode “detectar” uma letra como separador em arquivos mais bagunçados. - Se você já sabe o formato do arquivo, prefira passar
delimiterdiretamente: é mais previsível.
csv vs pandas
1
2
3
4
5
6
7
8
9
10
import csv
import pandas as pd
# csv nativo (baixo nível)
with open('dados.csv', 'r', encoding='utf-8', newline='') as f:
reader = csv.DictReader(f)
dados = [row for row in reader]
# pandas (alto nível)
df = pd.read_csv('dados.csv')
Quando usar cada um?
✅ Use csv nativo quando:
- Arquivo muito simples
- Sem dependências externas
- Script leve
- Processamento linha por linha
- Não precisa análise
✅ Use pandas quando:
- Precisa análise de dados
- Operações complexas
- DataFrames para manipulação
- Estatísticas e agregações
- Performance com numpy
Conclusão
Neste guia da biblioteca csv, você aprendeu:
✅ DictReader - Ler como dicionários
✅ DictWriter - Escrever de dicionários
✅ Dialetos - Personalizar delimiter, quotechar
✅ csv.Sniffer - Detectar o delimitador de um arquivo desconhecido
✅ Casos práticos - Filtrar e transformar dados
✅ csv vs pandas - Quando usar cada um
Principais lições:
-
csvé nativa (sem instalar nada) - Perfeita para arquivos simples
-
DictReaderfacilita acesso por chaves - Para análise complexa, use pandas
- Bom para scripts leves
Próximos passos:
- Explore o read_csv() do Pandas para análise
- Aprenda a manipular JSON no Python para dados estruturados
- Pratique dialetos customizados com
csv.register_dialect() - Explore o read_csv() do Pandas com sep=”;” e decimal=”,” para CSV brasileiro
Neste artigo, exploramos a manipulação de arquivos CSV com Python.
Continue praticando e experimentando para aprimorar suas habilidades de manipulação de dados!
Se quiser praticar manipulação de dados e o resto da base do Python em projetos guiados, conheça a Jornada Python, nosso curso de Python completo.
Até a próxima! 👋
"Porque o Senhor dá a sabedoria, e da sua boca vem a inteligência e o entendimento" Pv 2:6