Módulo 7 - Trabalhando com JSON
Lendo e gravando arquivos JSON
11 min de leitura · por Cesar Gargiulo, revisado pela equipe ValorFinal e GuardiaSec · Atualizado em 01/07/2026
O que você vai aprender
- Gravar dados em um arquivo JSON com json.dump e with open.
- Ler um arquivo JSON de volta para o Python com json.load.
- Abrir arquivos com encoding utf-8 para preservar acentos.
- Entender o ciclo completo de salvar e recuperar dados em disco.
Ouvir o resumo desta aula
Um recap de cerca de 2 minutos na voz do Valim, para ouvir no trânsito ou na academia.
Ler a transcrição do resumo
Resumo da aula: Lendo e gravando arquivos JSON.
Os objetivos desta aula. Gravar dados em um arquivo JSON com json.dump e with open. Ler um arquivo JSON de volta para o Python com json.load. Abrir arquivos com encoding utf-8 para preservar acentos. Entender o ciclo completo de salvar e recuperar dados em disco.
Veja o essencial, parte por parte.
Gravando um arquivo com json.dump. json.dump(dados, arquivo) grava os dados como JSON direto em um arquivo aberto.
Lendo o arquivo de volta com json.load. Sem o encoding, o Python usa o padrão do sistema, que pode não ser utf-8 no Windows.
As quatro funções, lado a lado. Agora você conhece as quatro funções principais do módulo json, e vale organizá-las na cabeça.
Esse foi o resumo do essencial. Para se aprofundar, leia a aula completa e responda os exercícios.
Gravando um arquivo com json.dump
Até aqui você converteu dados de e para strings. Para guardar algo entre uma execução e outra do programa, é preciso gravar em disco. A função json.dump, sem o s, faz isso: em vez de devolver uma string, ela escreve o JSON direto em um arquivo. Você abre o arquivo em modo de escrita com with open e passa o objeto de arquivo como segundo argumento. Veja o padrão completo, já com os cuidados de indentação e acentos.
import json
agenda = {
"contatos": [
{"nome": "João", "cidade": "São Paulo"},
{"nome": "Íris", "cidade": "Belém"},
]
}
with open("agenda.json", "w", encoding="utf-8") as arquivo:
json.dump(agenda, arquivo, indent=2, ensure_ascii=False)
print("Arquivo agenda.json gravado.")json.dump grava direto no arquivo. O with open cuida de abrir e fechar com segurança.
Depois desse código, existe um arquivo chamado agenda.json na pasta do programa, com o conteúdo indentado e os acentos preservados. O with open abre o arquivo, e o bloco indentado é onde você trabalha com ele; ao sair do bloco, o Python fecha o arquivo sozinho, garantindo que tudo foi gravado. O modo "w" significa escrita e cria o arquivo se ele não existir, ou substitui o conteúdo se já existir.
Lendo o arquivo de volta com json.load
Gravar só faz sentido se depois você recupera os dados. A função json.load, também sem o s, lê um arquivo aberto em modo de leitura e devolve os dados do Python de volta. O modo agora é "r", de leitura, e o encoding continua sendo utf-8. O resultado é o mesmo dicionário ou lista que você gravou, pronto para usar. Este é o ciclo completo: dump para salvar, load para recuperar.
import json
with open("agenda.json", "r", encoding="utf-8") as arquivo:
agenda = json.load(arquivo)
print(type(agenda)) # <class 'dict'>
for contato in agenda["contatos"]:
print(contato["nome"], "-", contato["cidade"])
# João - São Paulo
# Íris - Belémjson.load lê o arquivo e reconstrói os dados. Os acentos voltam intactos graças ao utf-8.
O detalhe do encoding merece atenção porque é uma fonte silenciosa de bugs. Se você grava com utf-8 e lê sem informar o encoding, ou vice-versa, os acentos podem sair embaralhados ou o programa pode falhar. A regra é simples: informe encoding="utf-8" em toda abertura de arquivo de texto. Assim o mesmo código funciona igual no Windows, no Linux e no macOS, sem surpresas com o São Paulo virando algo ilegível.
As quatro funções, lado a lado
Agora você conhece as quatro funções principais do módulo json, e vale organizá-las na cabeça. A diferença é entre trabalhar com strings ou com arquivos, e entre ir ou voltar. As funções com s no nome, dumps e loads, lidam com strings na memória. As sem s, dump e load, lidam com arquivos. E dentro de cada par, dump escreve e load lê. Essa tabela resume tudo.
| Função | Direção | Trabalha com |
|---|---|---|
| json.dumps | Python para JSON | String (na memória) |
| json.loads | JSON para Python | String (na memória) |
| json.dump | Python para JSON | Arquivo (em disco) |
| json.load | JSON para Python | Arquivo (em disco) |
As quatro funções do módulo json: o s indica string; sem s indica arquivo.
Com esse mapa, escolher a função certa vira automático. Recebeu uma string de uma API e quer os dados? loads. Tem dados e quer salvar em disco? dump. Quer só ver o JSON impresso na tela? dumps. Quer carregar de um arquivo salvo antes? load. As quatro seguem a mesma lógica de tipos e aceitam os mesmos argumentos de formatação, então o que você aprendeu nas aulas anteriores continua valendo aqui, agora aplicado a arquivos reais.
Teste rápido
Ao gravar e ler um arquivo JSON com nomes acentuados, qual cuidado evita acentos embaralhados?
Perguntas frequentes
- Preciso fechar o arquivo depois de gravar?
- Se você usa with open, não. O with fecha o arquivo automaticamente ao sair do bloco, mesmo que ocorra um erro no meio. Por isso ele é a forma recomendada. Se abrisse com open sem o with, aí sim precisaria chamar arquivo.close() manualmente, o que é mais sujeito a esquecimento.
- O que a diferença entre os modos "w" e "r"?
- O modo "w" é de escrita: ele cria o arquivo ou substitui todo o conteúdo existente. O modo "r" é de leitura: ele abre um arquivo que já existe para ler. Existe também o "a", de acréscimo, que adiciona ao final sem apagar, mas para JSON estruturado o padrão é reescrever o arquivo inteiro com "w".
- O que acontece se eu tentar ler um arquivo que não existe?
- O Python levanta um FileNotFoundError. Para tratar isso, você pode envolver a leitura em um try e except, ou verificar antes se o arquivo existe. Em um programa real, é comum criar o arquivo com dados vazios na primeira execução caso ele ainda não exista.
- Por que usar json.dump em vez de dumps mais uma gravação manual?
- Dá para converter com dumps e depois escrever a string no arquivo, e funciona. Mas o json.dump faz os dois passos de uma vez, com menos código e menos chance de erro. Ele grava direto no arquivo aberto, então é a forma mais direta e recomendada de salvar JSON em disco.
- O indent vale a pena em arquivos que vão crescer muito?
- Depende do uso. Se um humano vai abrir e ler o arquivo, o indent ajuda muito. Se o arquivo é só consumido por programas e pode ficar grande, dispensar o indent economiza espaço, já que os espaços de indentação somam. Para a maioria dos casos de estudo e configuração, o indent=2 compensa.
- Posso guardar o arquivo JSON em outra pasta?
- Sim. Basta informar o caminho completo ou relativo no open, como "dados/agenda.json". A pasta precisa existir antes, senão o Python levanta um erro ao tentar gravar. Você pode criar pastas pelo código com o módulo os ou pathlib, temas que aparecem quando você trabalha mais com arquivos.
Fontes
Seu progresso fica salvo neste aparelho. Assinantes sincronizam entre os aparelhos.