Excel e CSV são as moedas de troca mais comuns em análise de dados no Brasil. Saber ler e escrever esses formatos corretamente — com encoding correto, formatação profissional e múltiplas abas — é uma habilidade diária para qualquer analista que usa Python.

Lendo CSV: opções essenciais

import pandas as pd

# CSV simples:
df = pd.read_csv("dados.csv")

# CSV brasileiro (ponto e vírgula, vírgula decimal):
df = pd.read_csv("dados.csv",
    sep=";",
    decimal=",",
    encoding="latin-1",   # ou "utf-8"
    parse_dates=["data"],  # converte coluna para datetime
    dayfirst=True          # interpreta DD/MM/AAAA
)

# Ler apenas colunas específicas:
df = pd.read_csv("dados.csv", usecols=["cliente", "valor", "data"])

# Ler em chunks para arquivos grandes:
chunks = pd.read_csv("grande.csv", chunksize=100000)
df = pd.concat(chunks, ignore_index=True)

Escrevendo CSV

# Padrão internacional:
df.to_csv("resultado.csv", index=False)

# Compatível com Excel brasileiro:
df.to_csv("resultado.csv",
    sep=";",
    decimal=",",
    index=False,
    encoding="utf-8-sig"  # BOM para Excel abrir com acentos corretos
)

Lendo Excel

pip install openpyxl
# Aba específica:
df = pd.read_excel("relatorio.xlsx", sheet_name="Vendas")

# Todas as abas de uma vez (retorna dicionário):
dfs = pd.read_excel("relatorio.xlsx", sheet_name=None)
for nome_aba, df in dfs.items():
    print(f"{nome_aba}: {len(df)} linhas")

# Ignorar linhas de cabeçalho extra:
df = pd.read_excel("relatorio.xlsx", header=2)  # cabeçalho na 3ª linha

Escrevendo Excel: múltiplas abas

with pd.ExcelWriter("relatorio.xlsx", engine="openpyxl") as writer:
    df_sul.to_excel(writer, sheet_name="Sul", index=False)
    df_norte.to_excel(writer, sheet_name="Norte", index=False)
    resumo.to_excel(writer, sheet_name="Resumo", index=False)

Formatando Excel com openpyxl

from openpyxl import load_workbook
from openpyxl.styles import Font, PatternFill, Alignment

wb = load_workbook("relatorio.xlsx")
ws = wb["Vendas"]

# Formatando o cabeçalho:
for cell in ws[1]:
    cell.font = Font(bold=True, color="FFFFFF")
    cell.fill = PatternFill(fill_type="solid", fgColor="1A3A6E")
    cell.alignment = Alignment(horizontal="center")

# Ajustando largura das colunas:
for col in ws.columns:
    max_len = max(len(str(cell.value or "")) for cell in col)
    ws.column_dimensions[col[0].column_letter].width = max_len + 4

wb.save("relatorio_formatado.xlsx")

Perguntas frequentes

Por que meu CSV abre com caracteres errados no Excel?

Dois problemas comuns: (1) encoding errado — use encoding="utf-8-sig" ao salvar para que o Excel detecte UTF-8 com BOM; (2) separador errado — o Excel brasileiro usa ponto e vírgula. Use sep=";".

xlrd vs openpyxl: qual usar?

Use openpyxl para arquivos .xlsx (o padrão moderno). xlrd só suporta o formato antigo .xls. Configure com engine="openpyxl" no read_excel e ExcelWriter.