Como manipular arquivos CSV no Python

Cansado de programar?

Conheça a melhor e mais completa formação de Python e Django e sinta-se um programador verdadeiramente competente. Além de Python e Django, você também vai aprender Banco de Dados, SQL, HTML, CSS, Javascript, Bootstrap e muito mais!

Quero aprender Python e Django de Verdade! Quero aprender!
Suporte

Tire suas dúvidas diretamente com o professor

Projetos práticos

Projetos práticos voltados para o mercado de trabalho

Prática profissional

Formação moderna com foco na prática profissional

Download do Artigo

✅ Artigo atualizado em Setembro 2026 Adicionamos as seções que a introdução prometia e o corpo não tinha: DictReader/DictWriter, delimiter e quotechar para CSV brasileiro com ponto e vírgula e csv.Sniffer. Todos os exemplos agora abrem os arquivos com encoding="utf-8" e newline="" 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?

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 ser cp1252) e nomes como “João” podem virar “João” ou gerar UnicodeDecodeError.
  • newline='': a documentação do módulo csv recomenda abrir o arquivo assim tanto para ler quanto para escrever, porque o próprio módulo csv cuida 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? :thumbsup:

Que tal receber 30 dias de conteúdo direto na sua Caixa de Entrada?

Sua assinatura não pôde ser validada.
Você fez sua assinatura com sucesso.

Assine as PyDicas e receba 30 dias do melhor conteúdo Python na sua Caixa de Entrada: direto e sem enrolação!

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.

:bulb: 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-1 em vez de UTF-8. Se aparecer UnicodeDecodeError, troque o encoding do open para '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çar csv.Error (“Could not determine delimiter”), principalmente com amostras pequenas ou campos entre aspas. Por isso usamos try/except com um dialeto padrão.
  • O parâmetro delimiters limita 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 delimiter diretamente: é 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
  • DictReader facilita acesso por chaves
  • Para análise complexa, use pandas
  • Bom para scripts leves

Próximos passos:

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! 👋

Começe agora sua Jornada na Programação!

Não deixe para amanhã o sucesso que você pode começar a construir hoje!

#newsletter Olá :wave: Curtiu o artigo? Então faça parte da nossa Newsletter! Privacidade Não se preocupe, respeitamos sua privacidade. Você pode se descadastrar a qualquer momento.