CSV: O que É e Como Funciona | Python Brasil
Aprenda a manipular arquivos CSV em Python: leitura, escrita, DictReader, DictWriter, pandas e boas praticas para processar dados tabulares.
O que e CSV?
CSV (Comma-Separated Values) e um formato de arquivo simples para armazenar dados tabulares em texto puro. Cada linha representa um registro e os campos sao separados por um delimitador — geralmente virgula, mas pode ser ponto-e-virgula, tab ou outro caractere. CSV e amplamente usado para importacao e exportacao de dados entre sistemas, planilhas e bancos de dados.
Python possui o modulo embutido csv que facilita a leitura e escrita de arquivos CSV, tratando automaticamente casos especiais como campos com virgulas, quebras de linha e aspas.
Leitura Basica
import csv
# Leitura simples com csv.reader
with open('dados.csv', 'r', encoding='utf-8') as arquivo:
leitor = csv.reader(arquivo)
cabecalho = next(leitor) # primeira linha (cabecalho)
print(f'Colunas: {cabecalho}')
for linha in leitor:
print(linha) # cada linha e uma lista de strings
# Leitura com DictReader (cada linha vira dicionario)
with open('dados.csv', 'r', encoding='utf-8') as arquivo:
leitor = csv.DictReader(arquivo)
for registro in leitor:
print(f"Nome: {registro['nome']}, Idade: {registro['idade']}")
Escrita Basica
import csv
# Escrita com csv.writer
dados = [
['nome', 'idade', 'cidade'],
['Ana', '28', 'Sao Paulo'],
['Bruno', '35', 'Rio de Janeiro'],
['Carla', '22', 'Belo Horizonte'],
]
with open('saida.csv', 'w', encoding='utf-8', newline='') as arquivo:
escritor = csv.writer(arquivo)
escritor.writerows(dados)
# Escrita com DictWriter
registros = [
{'nome': 'Ana', 'idade': 28, 'cidade': 'Sao Paulo'},
{'nome': 'Bruno', 'idade': 35, 'cidade': 'Rio de Janeiro'},
{'nome': 'Carla', 'idade': 22, 'cidade': 'Belo Horizonte'},
]
with open('saida.csv', 'w', encoding='utf-8', newline='') as arquivo:
campos = ['nome', 'idade', 'cidade']
escritor = csv.DictWriter(arquivo, fieldnames=campos)
escritor.writeheader()
escritor.writerows(registros)
Delimitadores e Dialetos
import csv
# CSV com ponto-e-virgula (comum em sistemas brasileiros)
with open('dados_br.csv', 'r', encoding='utf-8') as arquivo:
leitor = csv.reader(arquivo, delimiter=';')
for linha in leitor:
print(linha)
# CSV com tabulacao (TSV)
with open('dados.tsv', 'r', encoding='utf-8') as arquivo:
leitor = csv.reader(arquivo, delimiter='\t')
for linha in leitor:
print(linha)
# Registrando um dialeto customizado
csv.register_dialect('brasileiro', delimiter=';', quotechar='"',
quoting=csv.QUOTE_MINIMAL)
with open('dados_br.csv', 'r', encoding='utf-8') as arquivo:
leitor = csv.reader(arquivo, dialect='brasileiro')
for linha in leitor:
print(linha)
# Ver dialetos disponiveis
print(csv.list_dialects()) # ['excel', 'excel-tab', 'unix']
Processamento de Dados
import csv
from collections import Counter
# Calcular estatisticas
with open('vendas.csv', 'r', encoding='utf-8') as arquivo:
leitor = csv.DictReader(arquivo)
registros = list(leitor)
# Total de vendas
total = sum(float(r['valor']) for r in registros)
print(f'Total: R$ {total:.2f}')
# Vendas por cidade
por_cidade = Counter(r['cidade'] for r in registros)
for cidade, qtd in por_cidade.most_common():
print(f'{cidade}: {qtd} vendas')
# Filtrar e gravar novo CSV
vendas_sp = [r for r in registros if r['cidade'] == 'Sao Paulo']
with open('vendas_sp.csv', 'w', encoding='utf-8', newline='') as arquivo:
escritor = csv.DictWriter(arquivo, fieldnames=registros[0].keys())
escritor.writeheader()
escritor.writerows(vendas_sp)
CSV com Pandas
Para arquivos maiores ou analises mais complexas, o pandas oferece funcionalidade muito mais poderosa.
import pandas as pd
# Leitura
df = pd.read_csv('dados.csv', encoding='utf-8')
print(df.head())
print(df.describe())
# Leitura com opcoes
df = pd.read_csv(
'dados_br.csv',
sep=';',
encoding='utf-8',
decimal=',', # virgula como decimal (padrao brasileiro)
parse_dates=['data'], # interpretar coluna como data
dtype={'cep': str}, # forcar tipo de coluna
)
# Filtrar e processar
vendas_grandes = df[df['valor'] > 1000]
por_mes = df.groupby(df['data'].dt.month)['valor'].sum()
# Gravar
df.to_csv('saida.csv', index=False, encoding='utf-8')
vendas_grandes.to_csv('grandes.csv', index=False, sep=';')
Tratamento de Erros e Casos Especiais
import csv
# Lidar com encoding
def ler_csv_seguro(caminho: str) -> list[dict]:
"""Tenta ler CSV com diferentes encodings."""
encodings = ['utf-8', 'latin-1', 'cp1252']
for enc in encodings:
try:
with open(caminho, 'r', encoding=enc) as f:
return list(csv.DictReader(f))
except UnicodeDecodeError:
continue
raise ValueError(f'Nao foi possivel ler {caminho} com nenhum encoding')
# Lidar com campos ausentes
with open('incompleto.csv', 'r', encoding='utf-8') as arquivo:
leitor = csv.DictReader(arquivo, restval='N/A')
for registro in leitor:
nome = registro.get('nome', 'Desconhecido')
idade = registro.get('idade', '0')
print(f'{nome}: {idade}')
# Grandes arquivos — processar linha por linha
def processar_csv_grande(caminho: str):
"""Processa CSV grande sem carregar tudo na memoria."""
with open(caminho, 'r', encoding='utf-8') as arquivo:
leitor = csv.DictReader(arquivo)
total = 0
for i, registro in enumerate(leitor):
total += float(registro.get('valor', 0))
if (i + 1) % 100000 == 0:
print(f'Processadas {i + 1} linhas...')
return total
Erros Comuns
O erro mais frequente e esquecer o parametro newline='' ao abrir o arquivo para escrita, causando linhas em branco extras no Windows. Outro erro e assumir que o separador e virgula quando no Brasil frequentemente se usa ponto-e-virgula. Tambem e comum nao especificar o encoding, causando erros com caracteres acentuados. Tentar carregar arquivos CSV muito grandes inteiramente na memoria com list() em vez de processar linha por linha e outro problema recorrente.
Boas Praticas
Sempre especifique encoding='utf-8' e newline='' ao abrir arquivos CSV. Use DictReader e DictWriter para maior legibilidade. Para arquivos grandes, processe linha por linha. Para analise de dados, use pandas. Valide os dados ao ler de fontes externas. Documente o formato esperado do CSV (delimitador, encoding, colunas).
Quando Usar
CSV e ideal para troca de dados simples e tabulares entre sistemas, importacao e exportacao de planilhas, e armazenamento de dados que nao precisam de relacionamentos complexos. Para dados hierarquicos, prefira JSON. Para grandes volumes com consultas complexas, use um banco de dados.