Módulo 8 - Arquivos CSV e pathlib

Lendo CSV

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

O que você vai aprender

  • Abrir um CSV com with open e o parâmetro newline vazio.
  • Percorrer as linhas com csv.reader, recebendo cada linha como lista.
  • Ler por nome de coluna com csv.DictReader, recebendo dicionários.
  • Escolher entre reader e DictReader conforme a tarefa.

Ler um CSV em três passos

Ler um CSV com Python é surpreendentemente direto quando se usa o módulo csv, que já vem na biblioteca padrão. Você não precisa se preocupar em separar os campos na mão, cuidar de aspas ou tratar vírgulas dentro de um texto: o módulo faz isso por você. O padrão tem três passos: abrir o arquivo, criar um leitor em cima dele e percorrer o leitor com um laço. Veja a forma mais básica, com csv.reader, que entrega cada linha como uma lista de textos.

import csv

with open("alunos.csv", newline="", encoding="utf-8") as arquivo:
    leitor = csv.reader(arquivo)
    for linha in leitor:
        print(linha)

# ['nome', 'nota', 'cidade']
# ['Ana', '9.5', 'Recife']
# ['Bruno', '7.0', 'Salvador']
# ['Carla', '8.5', 'Natal']

csv.reader devolve cada linha como uma lista de strings, incluindo o cabeçalho.

Três detalhes merecem atenção. Primeiro, o with open: ele abre o arquivo e garante que ele será fechado no fim, mesmo se der erro no meio, algo que você entende a fundo na aula sobre with. Segundo, o newline='' : sempre presente ao abrir CSV, porque deixa o módulo csv cuidar das quebras de linha e evita linhas em branco fantasma em alguns sistemas. Terceiro, o encoding='utf-8', que garante a leitura correta de acentos. Note também que tudo vem como texto: a nota 9.5 chega como a string '9.5', não como número. Converter é tarefa sua.

DictReader: acessar por nome de coluna

Ler por posição funciona, mas exige lembrar que a nota está em linha[1] e a cidade em linha[2]. Isso é frágil: se alguém trocar a ordem das colunas, o programa quebra em silêncio. O csv.DictReader resolve isso. Ele usa a primeira linha como cabeçalho e entrega cada linha seguinte como um dicionário, com os nomes das colunas como chaves. Você acessa os campos pelo nome, que é muito mais claro e resistente a mudanças de ordem.

import csv

with open("alunos.csv", newline="", encoding="utf-8") as arquivo:
    leitor = csv.DictReader(arquivo)
    for linha in leitor:
        nome = linha["nome"]
        nota = float(linha["nota"])
        print(f"{nome} tirou {nota}")

# Ana tirou 9.5
# Bruno tirou 7.0
# Carla tirou 8.5

DictReader entrega dicionários; o cabeçalho vira chave e não aparece como dado.

Repare em duas vantagens. O cabeçalho não aparece mais como uma linha de dados: o DictReader já o consumiu para virar as chaves, então o laço só percorre os registros reais. E o acesso por nome, linha['nota'], diz exatamente o que você quer, sem depender da posição. A conversão continua sendo sua: float(linha['nota']) transforma o texto '9.5' no número 9.5 para poder somar ou comparar. Esse é o padrão que você vai usar no relatório de vendas no fim do módulo.

csv.reader

  • Cada linha vira uma lista
  • Acesso por posição: linha[1]
  • O cabeçalho vem como primeira linha
  • Bom para arquivos sem cabeçalho

csv.DictReader

  • Cada linha vira um dicionário
  • Acesso por nome: linha['nota']
  • O cabeçalho vira as chaves
  • Melhor quando há cabeçalho claro

Detalhes que evitam erro na leitura

Alguns cuidados poupam horas de depuração. Se o arquivo usa ponto e vírgula, informe o separador: csv.DictReader(arquivo, delimiter=';'). Sem isso, o Python lê tudo como uma coluna só e você recebe dicionários estranhos. Lembre também que todo valor vem como texto, então converta números com int ou float antes de calcular. E, ao percorrer, use nomes de variável claros: para cada linha, extraia os campos com nomes que expliquem o dado, em vez de ficar repetindo linha['algo'] o tempo todo.

import csv

total = 0.0
com_ponto_virgula = "vendas.csv"

with open(com_ponto_virgula, newline="", encoding="utf-8") as arquivo:
    leitor = csv.DictReader(arquivo, delimiter=";")
    for linha in leitor:
        valor = float(linha["valor"])
        total = total + valor

print(f"Total: R$ {total:.2f}")  # Total: R$ 1250.00

Somando uma coluna de um CSV com ponto e vírgula, convertendo cada valor para número.

Teste rápido

Qual a principal vantagem de usar csv.DictReader em vez de csv.reader?

Perguntas frequentes

Por que preciso passar newline='' ao abrir um CSV?
Porque o módulo csv já cuida das quebras de linha internamente. Se você deixar o Python também processá-las, em alguns sistemas surgem linhas em branco extras entre os registros. Passar newline='' entrega o controle das quebras ao módulo csv, que é o comportamento recomendado na documentação oficial.
Os números que leio do CSV já vêm prontos para calcular?
Não. Tudo que o módulo csv lê vem como texto. A nota 9.5 chega como a string '9.5'. Para somar ou comparar, você precisa converter com float('9.5') ou int('3'). Esquecer isso é uma das causas mais comuns de resultados errados.
Quando usar csv.reader e quando usar csv.DictReader?
Use DictReader quando o arquivo tem um cabeçalho claro e você quer acessar as colunas pelo nome, que é o caso mais comum. Use reader quando não há cabeçalho, quando você quer a linha inteira como lista, ou em arquivos bem simples em que a posição basta.
Como leio um CSV separado por ponto e vírgula?
Passe o parâmetro delimiter ao criar o leitor: csv.DictReader(arquivo, delimiter=';') ou csv.reader(arquivo, delimiter=';'). Sem isso, o Python usa a vírgula como separador e lê tudo como uma coluna só. Confira o separador abrindo o arquivo no editor de texto antes.
O DictReader ainda me devolve a linha do cabeçalho?
Não. O DictReader consome a primeira linha para transformar em chaves do dicionário, então o laço só percorre os registros de dados. Já o csv.reader devolve o cabeçalho como a primeira lista, e você precisa pular ou tratar essa linha se não quiser processá-la como dado.
Preciso fechar o arquivo depois de ler?
Com o with open você não fecha na mão: o bloco with fecha o arquivo automaticamente ao terminar, mesmo se ocorrer um erro no meio da leitura. É por isso que o with é o jeito recomendado de abrir arquivos, tema aprofundado na aula sobre context managers.

Fontes

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