Manipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos

  1. Início
  2. Blog
  3. Desenvolvimento de software

Desenvolvimento de Software

Manipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos

Quase todo script real lê ou grava um arquivo. Aprenda a maneira segura de abrir arquivos, escolha o modo correto, manipule CSV e JSON, trabalhe com caminhos usando pathlib e evite o erro que apaga seus dados.

9 min de leitura
Manipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos

Principais pontos

  • Sempre abra arquivos com um bloco with, para que eles fechem automaticamente.
  • Modo "w" apaga um arquivo existente. Use "a" para adicionar a um ou "x" para recusar a substituição.
  • Faça um loop no objeto de arquivo para ler arquivos grandes sem carregar tudo na memória.
  • Passe encoding="utf-8" explicitamente e prefira pathlib para construir caminhos.

Logs, relatórios, configuração, exportações: mais cedo ou mais tarde, todo script toca o sistema de arquivos. O manuseio de arquivos Python é simples para começar, mas alguns detalhes decidem se seu código é confiável ou destrói dados silenciosamente.

Este guia aborda arquivos de texto, CSV, JSON, dados binários e caminhos, com foco em hábitos seguros. Executamos esses exemplos no Python 3.13 em uma pasta temporária e a saída mostrada vem dessa execução.

Abra arquivos com open() e com

A função interna open() retorna um objeto de arquivo. Use-o dentro de um bloco with:

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("first line\n")
    file.write("second line\n")

print(file.closed)

# True

Quando o bloco termina, o Python fecha o arquivo, mesmo que tenha ocorrido um erro dentro dele. Sem with, você mesmo precisa chamar close(), e uma exceção pode pular essa linha. Usar um arquivo depois de fechado gera um erro:

file.read()

# ValueError: I/O operation on closed file.

Modos de arquivo

O segundo argumento para open() diz o que você planeja fazer:

Modo Significado Se o arquivo existir Se isso não acontecer
R Ler (padrão) Abre Erro
o que Escreva Apaga primeiro Cria
um Anexar Adiciona ao final Cria
x Criação exclusiva Erro Cria
r+ Ler e escrever Abre Erro

Adicione b para dados binários, como em "rb" ou "wb". Texto é o padrão e também pode ser escrito explicitamente como t.

Escreva e anexe

write() não adiciona uma quebra de linha, então inclua \n você mesmo. Anexar mantém o que já está lá:

with open("notes.txt", "a", encoding="utf-8") as file:
    file.write("third line\n")

Compare isso com o modo "w", que substituiu nossas três linhas por uma, sem nenhum aviso:

with open("notes.txt", "w", encoding="utf-8") as file:
    file.write("replaced\n")

# notes.txt now contains only: replaced

Quando você não deve sobrescrever algo, use "x". Levantou FileExistsError em nosso teste, pois notes.txt já existia.

Ler um arquivo

Existem várias maneiras de ler, e a escolha certa depende do tamanho do arquivo:

Abordagem Devoluções Melhor para
file.read() Uma corda com tudo Arquivos pequenos
file.readline() A próxima linha Lendo um cabeçalho
file.readlines() Uma lista de linhas Arquivos pequenos que você precisa como uma lista
para linha no arquivo Uma linha de cada vez Qualquer tamanho, especialmente arquivos grandes
with open("notes.txt", encoding="utf-8") as file:
    print(repr(file.read()))

# 'first line\nsecond line\n'

with open("notes.txt", encoding="utf-8") as file:
    for line in file:
        print(line.strip())

# first line
# second line
# third line

Observe os caracteres \n mantidos na string bruta. strip() os remove. Um objeto de arquivo também lembra sua posição, então a leitura continua de onde parou:

with open("notes.txt", encoding="utf-8") as file:
    print(file.readline().strip())
    print(file.readlines())

# first line
# ['second line\n', 'third line\n']

Fazer um loop no arquivo é a técnica chave para grandes logs e exportações. Ele lê uma linha por vez, portanto, um arquivo de vários gigabytes não precisa caber na memória.

Lidar com erros de arquivo

Os arquivos podem estar ausentes, bloqueados ou ilegíveis, então planeje isso:

try:
    with open("missing.txt", encoding="utf-8") as file:
        data = file.read()
except FileNotFoundError as error:
    print(error)

# [Errno 2] No such file or directory: 'missing.txt'
Exceção Causa típica
Erro FileNotFound O caminho não existe
Erro FileExists Modo x em um arquivo existente
Erro de permissão Não permitido ou bloqueado no Windows
IsADirectoryError O caminho é uma pasta
UnicodeDecodeError A codificação errada foi usada

Tente abrir o arquivo e detectar o erro, em vez de verificar primeiro com exists(), pois o arquivo pode desaparecer entre a verificação e a abertura. Nosso guia para tratamento de exceções em Python aborda essa abordagem.

Arquivos CSV

Não divida as linhas CSV por vírgula, pois os valores entre aspas podem conter vírgulas. O módulo padrão csv lida com essas regras. DictWriter e DictReader são as opções mais legíveis:

import csv

with open("orders.csv", "w", newline="", encoding="utf-8") as file:
    writer = csv.DictWriter(file, fieldnames=["id", "customer", "total"])
    writer.writeheader()
    writer.writerow({"id": 1, "customer": "Asha", "total": 1200})
    writer.writerow({"id": 2, "customer": "Ben", "total": 300})

with open("orders.csv", newline="", encoding="utf-8") as file:
    rows = list(csv.DictReader(file))

print(rows[0])
print(sum(int(r["total"]) for r in rows))

# {'id': '1', 'customer': 'Asha', 'total': '1200'}
# 1500

Dois detalhes importam. Passe newline="" ao abrir arquivos CSV, conforme recomendado pela documentação, para evitar linhas em branco no Windows. E cada valor retorna como uma string, números pares, e é por isso que precisávamos de int() na soma. Para trabalho pesado com dados, uma biblioteca como o pandas pode ser uma opção melhor.

Arquivos JSON

JSON é o formato usual para dados de configuração e API. Ele mapeia perfeitamente em dicionários Python e listas:

import json

config = {"debug": True, "retries": 3, "hosts": ["a", "b"]}

with open("config.json", "w", encoding="utf-8") as file:
    json.dump(config, file, indent=2)

with open("config.json", encoding="utf-8") as file:
    print(json.load(file)["retries"])

# 3

Lembre-se da nomenclatura: dump e load funcionam com arquivos, enquanto dumps e loads funcionam com strings. Tipos como datas não podem ser armazenados diretamente, então você precisará primeiro convertê-los em strings.

Trabalhe com caminhos usando pathlib

A colagem de caminhos com strings quebra os sistemas operacionais. O módulo padrão pathlib lida com separadores para você e oferece atalhos úteis:

from pathlib import Path

path = Path("data") / "reports" / "summary.txt"
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("all good\n", encoding="utf-8")

print(path.read_text(encoding="utf-8").strip())   # all good
print(path.suffix, path.stem, path.exists())      # .txt summary True
print(sorted(p.name for p in Path(".").glob("*.csv")))
# ['orders.csv']
Tarefa pathlib
Junte-se a caminhos Caminho("a") / "b.txt"
Crie pastas path.mkdir(parents=True, exist_ok=True)
Ler ou escrever o texto inteiro read_text(), write_text()
Encontre arquivos glob("*.csv"), rglob("*.py")
Excluir um arquivo path.unlink()
Obtenha a pasta do script atual Path(__file__).parent

Esse último resolve uma dor de cabeça comum. Os caminhos relativos são resolvidos a partir de onde você executou o script, e não de onde o script reside, portanto, construir caminhos a partir de Path(__file__).parent evita muitas surpresas de “arquivo não encontrado”.

Arquivos binários

Imagens, PDFs e arquivos ZIP não são texto. Abra-os com b e você lê e escreve bytes, sem nenhuma codificação envolvida:

with open("pixel.bin", "wb") as file:
    file.write(bytes([255, 0, 128]))

with open("pixel.bin", "rb") as file:
    print(file.read())

# b'\xff\x00\x80'

Gravações mais seguras

Se um programa travar no meio da gravação de um arquivo importante, você poderá ficar com um resultado corrompido. Uma solução comum é gravar primeiro em um arquivo temporário e depois trocá-lo:

temp = Path("settings.tmp")
temp.write_text("new", encoding="utf-8")
temp.replace("settings.txt")

print(Path("settings.txt").read_text(), temp.exists())

# new False

replace() substitui o destino. No mesmo sistema de arquivos, a renomeação é geralmente atômica, de modo que os leitores veem o arquivo antigo ou o novo, em vez de uma mistura escrita pela metade.

Dica: Nunca crie caminhos de arquivo diretamente a partir da entrada do usuário sem verificá-los. Um valor como ../../secrets.txt pode alcançar arquivos fora da pasta pretendida. Isso é conhecido como vulnerabilidade de passagem de caminho.

Um exemplo prático: resumir um log

Este pequeno roteiro reúne várias ideias. Ele lê um log uma linha por vez, portanto seu tamanho não importa, conta cada nível usando Counter e grava um resumo em um novo arquivo:

from collections import Counter

counts = Counter()
with open("app.log", encoding="utf-8") as file:
    for line in file:
        counts[line.split()[0]] += 1

with open("summary.txt", "w", encoding="utf-8") as out:
    for level, total in counts.most_common():
        out.write(f"{level}: {total}\n")

# summary.txt
# ERROR: 2
# INFO: 2
# WARN: 1

Nosso log de amostra tinha cinco linhas. Uma linha em branco quebraria line.split()[0], então os scripts reais devem pular as linhas vazias primeiro.

Erros comuns

  • Usando "w" quando você quis dizer "a". Seus dados existentes desaparecem imediatamente ao serem abertos, mesmo que você nunca escreva nada.
  • Omitindo a codificação. O padrão varia de acordo com o sistema, portanto, um script que funciona no Linux pode falhar no Windows com texto acentuado ou emoji.
  • Chamar read() em arquivos grandes. Isso pode esgotar a memória, então faça um loop nas linhas.
  • Esquecer int() dos valores CSV. "10" + "20" dá "1020".
  • Deixando de fora newline="" o CSV. Você pode obter linhas em branco inesperadas no Windows.
  • Não está testando o código do arquivo. Use o acessório tmp_path do pytest para que os testes nunca toquem em arquivos reais. Veja nosso tutorial de pytest.

Considerações finais

Alguns hábitos cobrem quase tudo aqui: use with, defina a codificação, pense duas vezes sobre "w" e deixe csv, json e pathlib fazerem as partes difíceis. Para praticar, escreva um pequeno script que leia um CSV, totalize uma coluna e salve um resumo JSON em uma nova pasta.

Perguntas frequentes

Como leio um arquivo linha por linha em Python?

Abra-o em um bloco with e faça um loop sobre o objeto de arquivo. Isso lê uma linha por vez, por isso funciona bem mesmo para arquivos muito grandes.

Qual é a diferença entre w e um modo?

O modo apaga qualquer conteúdo existente assim que o arquivo é aberto. O modo a mantém o conteúdo existente e adiciona novos dados ao final do arquivo.

Por que devo usar with para abrir um arquivo?

A instrução with fecha o arquivo automaticamente quando o bloco termina, mesmo que ocorra um erro. Isso evita vazamentos e ajuda a garantir que os dados sejam gravados.

Como posso verificar se existe um arquivo em Python?

Use Path(“name.txt”).exists() de pathlib. Se você planeja abri-lo logo em seguida, capturar FileNotFoundError geralmente é mais confiável do que verificar primeiro.

Por que meu CSV tem linhas em branco no Windows?

Você provavelmente abriu o arquivo sem newline=””. O módulo csv gerencia os próprios finais de linha, então passe esse argumento para evitar linhas extras em branco.

Continue aprendendo

Trabalhe com Stack Quora

Precisa de ajuda com testes, WordPress ou SEO?

Ajudamos as equipes a fornecer software melhor e a expandir seus sites. Conte-nos no que você está trabalhando e sugeriremos um próximo passo claro.

Continue lendo

Mais guias sobre testes, IA e desenvolvimento moderno

Gostou deste artigo? Escolha um tópico e vá direto para nossos tutoriais mais recentes.

Inteligência artificial

Explicação das alucinações de IA: por que os modelos de linguagem inventam as coisas e como reduzi-las

Explicação das alucinações de IA: o que são, por que os modelos de linguagem as produzem, tipos comuns, como reduzi-las com aterramento e instruções…

Leia o artigo →
DevOps

Variáveis de ambiente explicadas: arquivos .env, segredos e configuração bem feitos

Variáveis de ambiente explicadas com exemplos de Python que executamos: leitura e configuração, por que cada valor é uma string, arquivos .env, hera…

Leia o artigo →
Desenvolvimento de software

Explicação da limitação de taxa de API: algoritmos, cabeçalhos e tratamento de erros 429

Limitação de taxa de API explicada com uma simulação que executamos: token bucket, janela fixa, janela deslizante, 429 respostas, cabeçalhos de limi…

Leia o artigo →
Automação de testes

Zombando em Python: unittest.mock, patch e os erros que fazem os testes mentirem

Zombaria em Python com unittest.mock, testado: Mock e return_value, side_effect, patch onde um nome é usado, especificação e autospec, zombaria de d…

Leia o artigo →
Teste de software

Cobertura de código explicada: cobertura de linha versus filial e o que 100% realmente significa

Cobertura de código explicada com uma execução cobertura.py real: cobertura de linha, ramal e condição, leitura de um relatório, por que 100% de cob…

Leia o artigo →
Bancos de dados e SQL

DELETE vs TRUNCATE vs DROP em SQL: diferenças, reversão e quando usar cada um

DELETE vs TRUNCATE vs DROP explicado com SQL testado: o que cada um remove, rollback, aciona, redefinição de identidade, velocidade e como PostgreSQ…

Leia o artigo →
Bancos de dados e SQL

Exibições SQL explicadas: crie, use e evite as armadilhas, com exemplos

Visualizações SQL explicadas com consultas que executamos: criação de uma visualização, resultados ao vivo, ocultação de colunas, desempenho, visual…

Leia o artigo →
Desenvolvimento de software

Interface TypeScript vs tipo: diferenças reais, testadas com o compilador

Interface TypeScript versus tipo, verificada com o compilador real: o que ambos podem fazer, o que apenas um pode fazer, mesclagem de declarações, e…

Leia o artigo →
Desenvolvimento de software

Python *args e **kwargs explicados: funções flexíveis com exemplos claros

Python *args e **kwargs explicados com o código que executamos: empacotamento e descompactação, ordem dos parâmetros, argumentos somente de palavras…

Leia o artigo →
Desenvolvimento de software

Funções Python Lambda: sintaxe, usos reais e quando não usá-los

Funções lambda do Python explicadas com o código que executamos: sintaxe, classificação com chave, mapa e filtro, fechamentos, armadilha de ligação …

Leia o artigo →
Inteligência artificial

O que são agentes de IA? Como eles funcionam, com um loop de agente simples que você pode executar

O que são agentes de IA? Um guia simples para o loop do agente, ferramentas, memória e proteções, com um pequeno loop Python que executamos, riscos …

Leia o artigo →
DevOps

Monitoramento versus observabilidade: a verdadeira diferença, com logs, métricas e rastreamentos

Explicação do monitoramento versus observabilidade: falhas conhecidas e desconhecidas, logs, métricas e rastreamentos, um passo a passo do incidente…

Leia o artigo →
DevOps

Docker Volumes vs Bind Mounts: persista os dados do contêiner da maneira certa

Volumes Docker versus montagens de ligação explicadas: por que os dados do contêiner desaparecem, volumes nomeados, montagens de ligação, tmpfs, exe…

Leia o artigo →
Automação de testes

TDD vs BDD: principais diferenças, um recurso criado de ambas as maneiras e quando usar cada um

TDD vs BDD explicado com um recurso de desconto construído em ambos os sentidos: refatoração vermelho-verde com o código que executamos, cenários da…

Leia o artigo →
Teste de software

Teste de aceitação do usuário (UAT): processo, lista de verificação e exemplos reais

Explicação do teste de aceitação do usuário: quem o executa, como ele difere do controle de qualidade, um processo de sete etapas, um modelo de caso…

Leia o artigo →
Bancos de dados e SQL

Valores SQL NULL explicados: IS NULL, COALESCE, NULLIF e as armadilhas a serem evitadas

Valores SQL NULL explicados com consultas que executamos: lógica de três valores, IS NULL, COALESCE, NULLIF, como agregações, junções e classificaçã…

Leia o artigo →
Bancos de dados e SQL

Instrução SQL CASE WHEN: sintaxe, exemplos reais e erros comuns

SQL CASE WHEN explicado com consultas que executamos: formulários simples e pesquisados, ordem de condição, pivôs com SUM, truques COUNT, classifica…

Leia o artigo →
Desenvolvimento de software

O que é JWT? JSON Web Tokens explicados com um exemplo prático

O que é JWT? JSON Web Tokens explicados: as três partes, um token construído e adulterado no código que executamos, JWT vs sessões, armazenamento, t…

Leia o artigo →
Desenvolvimento de software

Loop de eventos JavaScript explicado: pilha de chamadas, microtarefas e temporizadores com exemplos

O loop de eventos JavaScript explicado com o código que executamos: pilha de chamadas, filas de tarefas e microtarefas, por que setTimeout 0 não é i…

Leia o artigo →
Desenvolvimento de software

Geradores Python e rendimento explicado: economize memória com exemplos reais

Geradores Python e rendimento explicados com o código que executamos: como eles pausam e reiniciam, medem economia de memória, pipelines, sequências…

Leia o artigo →
Inteligência artificial

O que são incorporações? Similaridade de vetores e cossenos explicada de forma simples

O que são incorporações? Um guia em linguagem simples para vetores, similaridade de cossenos e pesquisa semântica, com um pequeno exemplo que execut…

Leia o artigo →
DevOps

Implantação azul-verde vs canário: diferenças, compensações e como escolher

Explicação da implantação azul-verde versus canário: como cada um funciona, custo, risco e reversão, agrupamento estável de usuários que testamos, m…

Leia o artigo →
Automação de testes

Testes instáveis: o que os causa e como corrigi-los para sempre

Testes instáveis explicados com demonstrações que executamos: as principais causas, como confirmar e diagnosticar uma, soluções adequadas para tempo…

Leia o artigo →
Teste de software

Teste de carga versus teste de estresse: diferenças, métricas e exemplos k6

Teste de carga versus teste de estresse explicado: o que cada um prova, testes de pico e absorção, as métricas que importam, por que as médias engan…

Leia o artigo →
Teste de software

Caso de teste versus cenário de teste: principais diferenças, exemplos e quando usar cada um

Caso de teste vs cenário de teste explicado: definições claras, uma tabela lado a lado, um recurso de redefinição de senha retirado de cenários para…

Leia o artigo →
Bancos de dados e SQL

Otimização de consultas SQL: leia planos de execução e corrija consultas lentas, com intervalos

Otimização de consulta SQL testada em um milhão de linhas: leia planos de execução, adicione os índices corretos, corrija filtros não sargáveis, use…

Leia o artigo →
Bancos de dados e SQL

SQL UNION vs UNION ALL: diferenças, exemplos e desempenho testado

SQL UNION vs UNION ALL explicado com consultas que executamos: duplicatas, as regras que ambos seguem, um bug de dados real, desempenho medido, INTE…

Leia o artigo →
Desenvolvimento de software

Tutorial da API JavaScript Fetch: GET, POST, tratamento de erros e tempos limite

Um tutorial da API JavaScript Fetch testado em um servidor local: GET e POST, por que 404 não lança, um auxiliar reutilizável, strings de consulta, …

Leia o artigo →
Desenvolvimento de software

Manipulação de arquivos Python: leitura, gravação, CSV, JSON e pathlib com exemplos

Manipulação de arquivos Python explicada com código que executamos: modos abertos, com, leitura de arquivos grandes, CSV, JSON, pathlib, arquivos bi…

Leia o artigo →
Desenvolvimento de software

Classes e objetos Python: tutorial OOP com exemplos reais

Classes e objetos Python explicados com código que executamos: __init__, métodos, atributos de classe vs instância, herança, propriedades, métodos d…

Leia o artigo →
Inteligência artificial

O que é um modelo de linguagem grande? Como funcionam os LLMs, explicado sem exageros

O que é um modelo de linguagem grande? LLMs explicados em linguagem simples: tokens, incorporações, atenção, treinamento, temperatura e janelas de c…

Leia o artigo →
DevOps

Comandos Linux para iniciantes: o guia essencial do terminal com exemplos

Comandos Linux para iniciantes, agrupados por tarefa: navegação, arquivos, visualização de logs, grep, pipes, permissões, processos e arquivos, com …

Leia o artigo →
Automação de testes

Selenium vs Playwright: principais diferenças, código comparado e qual escolher

Selenium vs Playwright comparado: arquitetura, espera, suporte a navegador e linguagem, depuração, o mesmo teste em ambas as ferramentas, conselhos …

Leia o artigo →
Teste de software

Particionamento de equivalência: técnica de design de teste explicada com exemplos resolvidos

Explicação do particionamento de equivalência: como encontrar partições válidas e inválidas, exemplos resolvidos para idades, senhas e cupons, teste…

Leia o artigo →
Teste de software

Gravidade vs Prioridade em Testes de Software: Diferenças, Matriz e Exemplos Reais

Explicação da gravidade versus prioridade em testes de software: definições claras, uma matriz de quatro vias com exemplos, escalas de nível, quem d…

Leia o artigo →
Bancos de dados e SQL

Tutorial de subconsultas SQL: tipos, subconsultas correlacionadas e EXISTS com exemplos

Um tutorial de subconsultas SQL com consultas que executamos: subconsultas escalares, IN, FROM e SELECT, subconsultas correlacionadas, EXISTS, a arm…

Leia o artigo →
Bancos de dados e SQL

Transações SQL e ACID explicados: COMMIT, ROLLBACK e níveis de isolamento

Transações SQL e ACID explicadas com uma transferência bancária que executamos: COMMIT, ROLLBACK, savepoints, locks, níveis de isolamento, leituras …

Leia o artigo →
Desenvolvimento de software

Git merge vs rebase: diferenças, exemplos e quando usar cada um

Git merge vs rebase explicado com saída real do log, uma tabela comparativa, a regra de ouro do rebase e um fluxo de trabalho seguro para equipes.

Leia o artigo →
Desenvolvimento de software

List comprehension em Python: sintaxe, exemplos e quando evitar

List comprehension em Python explicada: sintaxe, filtros, if-else, laços aninhados, tempos medidos e quando um laço for comum é a melhor escolha.

Leia o artigo →
Bancos de dados e SQL

SQL JOIN explicado com exemplos (Inner, Left, Right, Full)

Entenda os joins SQL passo a passo com tabelas e consultas de exemplo: INNER, LEFT, RIGHT, FULL, CROSS e SELF, além de erros comuns e dicas de desem…

Leia o artigo →