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.

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ém

json.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çãoDireçãoTrabalha com
json.dumpsPython para JSONString (na memória)
json.loadsJSON para PythonString (na memória)
json.dumpPython para JSONArquivo (em disco)
json.loadJSON para PythonArquivo (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.