๐Ÿ’พ ๐Ÿ“„ โœจ
Capรญtulo 08 ยท Bootcamp programa AI

Persistรชncia com JSON

Cansou de perder os dados quando fecha o programa? Hoje vocรช aprende a SALVAR tudo em arquivo e LER de volta. Esse รฉ o capรญtulo que muda o jogo. ๐Ÿ’พ

๐Ÿ“ฆ import json ๐Ÿ’พ json.dump ๐Ÿ“– json.load ๐Ÿ› BugZilla
๐Ÿ˜ฑ
"Fechei o programa e SUMIU TUDO!"
O drama clรกssico de quem ainda nรฃo conhece persistรชncia

Vocรช cadastrou 20 alunos no sistema do Capรญtulo 07โ€ฆ

โ€ฆaรญ fechou o PyCharm, foi tomar um cafรฉ, voltou animado pra continuar โ€” e PUF, sumiu tudo. A lista voltou vazia. O computador "esqueceu". ๐Ÿซฅ

Por que isso acontece?

Tudo que mora numa variรกvel fica na memรณria RAM โ€” que รฉ um lugar rapidรญssimo mas volรกtil. Quando o programa fecha, a RAM รฉ liberada. Os dados somem.

Pra guardar de verdade, a gente precisa escrever os dados num arquivo no disco. Disco รฉ mais lento que RAM, mas nรฃo esquece โ€” mesmo se vocรช desligar o computador.

๐Ÿง โšก

RAM (memรณria)

Onde moram suas variรกveis enquanto o programa roda.

Some quando fecha.

๐Ÿ’พ๐Ÿ“„

Disco (arquivo)

Onde a gente persiste os dados num arquivo.

Permanece pra sempre.

๐Ÿ““ Pensa num caderno

Vocรช anota os contatos no caderno (escreve no disco). Depois fecha o caderno (fecha o programa). Daqui a uma semana vocรช abre de novo (abre o programa) โ€” e tรก lรก tudo, intacto. ร‰ EXATAMENTE isso que JSON faz pelo seu programa.

โœ๏ธ Anota
Vocรช escreve dados no caderno
๐Ÿ“• Fecha
Caderno na gaveta
๐Ÿ“– Abre
Pega de volta depois
๐ŸŽ‰ Tรก lรก!
Dados intactos

๐Ÿ’พ Calma. Vem aรญ a salvaรงรฃo: JSON.

JSON รฉ um formato simples de texto que o Python sabe ler e escrever. Vocรช salva suas listas e dicionรกrios num arquivo .json e pronto โ€” nunca mais perde nada.

๐Ÿงฉ
Quiz de Aquecimento
Antes da gente botar a mรฃo na massa
1๏ธโƒฃ Quando vocรช fecha um programa Python, o que acontece com as variรกveis?
2๏ธโƒฃ JSON quer dizer:
๐Ÿ“„
O que รฉ JSON?
JavaScript Object Notation โ€” texto que parece dicionรกrio

JSON รฉ um formato de texto pra guardar dados. Ele nasceu no mundo do JavaScript (daรญ o nome), mas hoje TODA linguagem entende โ€” inclusive Python.

E olha que coisa boa: JSON parece QUASE igual a um dicionรกrio Python. Se vocรช sabe dict, vocรช jรก sabe JSON quase de graรงa. ๐ŸŽ

๐Ÿ“š Comparaรงรฃo lado a lado

Olha como รฉ parecido:

Python ยท dict
na memรณria Python
aluno = {
    "nome": "Ana",
    "idade": 22,
    "ativo": True
}
โ‰ˆ idรชntico โ†’
Arquivo ยท JSON
aluno.json JSON
{
    "nome": "Ana",
    "idade": 22,
    "ativo": true
}
๐Ÿ”
Olho clรญnico: as รบnicas diferenรงas sรฃo pequenas โ€” em JSON o True vira true (minรบsculo) e None vira null. O resto รฉ a mesma coisa. Por isso a gente diz que JSON รฉ "o primo gรชmeo" do dicionรกrio Python.
๐Ÿ—ƒ๏ธ E uma lista de dicionรกrios?

Lembra da prateleira de fichas do Capรญtulo 07? Em JSON fica assim:

alunos.json JSON
1
2
3
4
5
6
7
8
9
10
11
12
[
    {
        "nome": "Ana",
        "idade": 22,
        "curso": "Python"
    },
    {
        "nome": "Joรฃo",
        "idade": 28,
        "curso": "IA"
    }
]
๐Ÿ“„
alunos.json
um arquivo de texto comum โ€” vocรช pode abrir no PyCharm, no Bloco de Notas, em qualquer editor
โœจ
A mรกgica: salvar โ†’ fechar โ†’ abrir โ†’ ler
O ciclo de vida dos seus dados

Aqui รฉ a hora do "AHA!". Olha esse ciclo todo, do comeรงo ao fim:

1. Programa rodando
๐Ÿ Lista de alunos na memรณria
json.dump(...)
2. Salvar
๐Ÿ’พ Python escreve no arquivo
3. Disco
๐Ÿ“„ alunos.json salvo!
programa fecha
4. Tempo passaโ€ฆ
๐Ÿ’ค Computador desligado, dia seguinteโ€ฆ
programa abre
5. Ler
๐Ÿ“– Python lรช o arquivo
json.load(...)
6. Voltou!
๐ŸŽ‰ Lista intacta na memรณria
๐Ÿช„
Resumo da mรกgica: json.dump = guarda no caderno (escreve). json.load = lรช o caderno de volta. Sรฃo as duas รบnicas funรงรตes que vocรช precisa decorar deste capรญtulo.
๐Ÿ’พ Hora de Persistir

Bora salvar de verdade!

Dois exercรญcios guiados juntos โ€” primeiro a gente salva, depois lรช. No final, um desafio solo รฉpico pra unir tudo.

8.0
Bora Codar! โ€” salvar_dados.py
Salvando uma lista de dicts num arquivo .json
๐ŸŽฏ
Desafio guiado pelo professor
Vamos fazer juntos ยท salvar_dados.py
๐Ÿ“ฆ import json โ€” o mรณdulo built-in

O Python jรก vem com a "caixa de ferramentas" pra mexer com JSON. Vocรช sรณ precisa importar ela no topo do arquivo: import json. Nรฃo precisa instalar nada.

A lรณgica do programa รฉ:

  • Cria uma lista de dicionรกrios (alunos, contatos, o que for)
  • Abre um arquivo no modo escrita ("w" de write)
  • Chama json.dump(dados, arquivo) โ€” a mรกgica acontece
  • Pronto โ€” tem um arquivo .json no seu projeto ๐ŸŽ‰
salvar_dados.py Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import json

# 1. lista de dicionรกrios (lembra do cap 07?)
alunos = [
    {"nome": "Ana",  "idade": 22, "curso": "Python"},
    {"nome": "Joรฃo", "idade": 28, "curso": "IA"},
]

# 2. abre o arquivo em modo escrita ("w") e salva
with open("alunos.json", "w") as arquivo:
    json.dump(alunos, arquivo, indent=4, ensure_ascii=False)

print("โœ… Dados salvos em alunos.json!")

Saรญda no terminal:

Run ยท salvar_dados.py
$ python salvar_dados.py

E ao lado do salvar_dados.py apareceu um arquivo novo:

๐Ÿ“„
alunos.json
criado automaticamente pelo Python โ€” abre ele no PyCharm pra ver o conteรบdo!
alunos.json (gerado) JSON
[
    {
        "nome": "Ana",
        "idade": 22,
        "curso": "Python"
    },
    {
        "nome": "Joรฃo",
        "idade": 28,
        "curso": "IA"
    }
]
โœจ
Reparou nos extras? indent=4 deixa o JSON bonitinho com identaรงรฃo (sem isso, vira uma linha sรณ horrรญvel). ensure_ascii=False permite acentos e emojis no arquivo (sem isso, "Joรฃo" virava "Joรฃo" โ€” feio).
โš ๏ธ
Atenรงรฃo ao modo "w": se o arquivo jรก existir, ele รฉ SOBRESCRITO (apagado e regravado). ร‰ o que a gente quer aqui โ€” mas tรก ligado.
8.1
Bora Codar! โ€” ler_dados.py
Recuperando os dados do arquivo .json
๐ŸŽฏ
Desafio guiado pelo professor
Vamos fazer juntos ยท ler_dados.py

Agora a outra metade da mรกgica. Crie um NOVO arquivo ler_dados.py (separado do salvar_dados.py) e bora resgatar os dados que vocรช acabou de salvar:

ler_dados.py Python
1
2
3
4
5
6
7
8
9
10
import json

# 1. abre o arquivo em modo leitura ("r" de read)
with open("alunos.json", "r", encoding="utf-8") as arquivo:
    alunos = json.load(arquivo)

# 2. agora 'alunos' รฉ uma lista de dicts NORMAL โ€” usa como sempre
for aluno in alunos:
    print(f"๐Ÿ‘ค {aluno['nome']} โ€” {aluno['idade']} anos โ€” curso: {aluno['curso']}")
Run ยท ler_dados.py
$ python ler_dados.py

๐Ÿช„ O que aconteceu de verdade

O json.load(arquivo) leu o texto do arquivo, entendeu que era JSON, e reconstruiu a lista de dicts idรชntica ร  que vocรช salvou. Vocรช fechou o programa, abriu de novo, e os dados voltaram. โœจ

๐Ÿ†š
dump ร— load: "dump" รฉ despejar os dados no arquivo. "load" รฉ carregar os dados do arquivo. Mesma famรญlia, sentidos opostos.
๐Ÿ“‚
Mas o que รฉ esse with open(...)?
Explicaรงรฃo leve โ€” sem complicar
๐Ÿ“ ร‰ a porta do arquivo

Pensa que o arquivo รฉ uma caixa fechada. Pra mexer nele, vocรช precisa abrir, fazer o que tem que fazer, e fechar. Se esquecer de fechar, dรก problema.

O with open(...) as arquivo: รฉ o jeitรฃo Python de fazer isso bonito: ele abre, deixa vocรช usar, e fecha sozinho no final. Sem chance de esquecer. ๐Ÿช„

estrutura geral Python
with open("nome_do_arquivo.json", "modo") as apelido:
    # aqui dentro vocรช usa "apelido" como se fosse o arquivo
    # quando o bloco acaba, Python fecha sozinho โœ…
๐Ÿšช Os modos mais comuns

O segundo argumento do open() รฉ o modo:

๐Ÿ“–

"r" โ€” read (ler)

Para ler um arquivo que Jร existe.

Usa com json.load(...).

โœ๏ธ

"w" โ€” write (escrever)

Para escrever. Cria o arquivo se nรฃo existir, sobrescreve se existir.

Usa com json.dump(...).

๐Ÿง˜
Nรฃo trava nisso agora. Por enquanto basta lembrar: "r" pra ler, "w" pra escrever. Depois, naturalmente, vocรช vai entender o resto.
๐Ÿ›
BugZilla apareceu de novo!
Os 3 erros clรกssicos com JSON
๐Ÿ›
Tรก com problema no seu JSON? Calma, รฉ uma das trรชs:
Erros que TODO mundo comete na primeira vez

Antes de surtar, confere essa lista โ€” quase sempre รฉ uma das trรชs coisas abaixo.

๐Ÿ› Bug #1 โ€” esqueci de importar json

Vocรช comeรงa a digitar json.dump(...) e o Python solta:

erro Terminal
NameError: name 'json' is not defined
๐Ÿฉน
Conserto: primeira linha do arquivo, sempre โ€” import json. Sem isso, o Python nรฃo sabe quem รฉ esse "json".

๐Ÿ› Bug #2 โ€” arquivo vazio quebra o json.load

Vocรช cria alunos.json manualmente, deixa em branco, e tenta carregar:

erro Terminal
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
๐Ÿฉน
Conserto: arquivo JSON vazio NรƒO ร‰ JSON vรกlido. Pra comeรงar do zero, escreve [] (lista vazia) ou {} (dict vazio) dentro dele. Ou entรฃo salva primeiro com json.dump([], arq).

๐Ÿ› Bug #3 โ€” modo errado: "r" vs "w"

Tentou ler um arquivo que ainda nรฃo existe, com modo "r":

erro Terminal
FileNotFoundError: [Errno 2] No such file or directory: 'alunos.json'
๐Ÿฉน
Conserto: ou roda o salvar_dados.py primeiro (pra criar o arquivo), ou trata o erro com try / except FileNotFoundError โ€” รฉ o que a gente vai usar no desafio final ๐Ÿ‘€.
๐ŸŽฏ
Quiz de Fixaรงรฃo
Antes do desafio final, bora confirmar
3๏ธโƒฃ Pra salvar uma lista de dicts num arquivo, vocรช usa:
4๏ธโƒฃ Vocรช abriu alunos.json com modo "w" e ele jรก tinha dados. O que acontece?
5๏ธโƒฃ Qual รฉ a primeira linha que NUNCA pode faltar?
8.2
Desafio Prรกtico โ€” sistema_cadastro_json.py
Pega o sistema do Cap 07 e PERSISTE de verdade
๐Ÿ’ช
Desafio Individual โ€” o "boss" do capรญtulo
Faรงa sozinho ยท sistema_cadastro_json.py
๐Ÿ’ก Dica para fazer sozinho

Lembra do sistema_cadastro.py do Capรญtulo 07? Aquele com menu (1-Adicionar, 2-Listar, 3-Buscar, 4-Sair) e uma lista de dicionรกrios dos alunos. Vocรช vai pegar exatamente esse e fazer 3 mudanรงas:

1. No comeรงo do programa, antes de mostrar o menu, tenta LER o arquivo alunos.json. Se existir, carrega na lista. Se NรƒO existir (primeira vez rodando), comeรงa com lista vazia.

2. A opรงรฃo 4-Sair deixa de sรณ dar break โ€” agora ela tambรฉm SALVA a lista no alunos.json antes de sair.

3. Pra tratar "arquivo nรฃo existe ainda" sem quebrar, usa try / except FileNotFoundError. Tipo: "tenta abrir; se nรฃo rolar, comeรงa vazio".

Conceitos que vocรช Jร tem: while True, if/elif/else, input(), append, for, list, dict, import json, json.dump, json.load, with open(...). Vocรช tem TODAS as peรงas. ๐Ÿ’ช

๐Ÿšจ
PARE! Tente sozinho primeiro. Esse รฉ o exercรญcio mais legal do capรญtulo โ€” vocรช vai sentir o "AHA!" de fazer um programa que lembra das coisas. Roda, cadastra um aluno, fecha. Roda DE NOVO e vรช os alunos voltando. Quem espia antes de tentar perde a maior parte do aprendizado!
๐Ÿ‘€ Sรณ clique aqui DEPOIS de tentar โ€” Ver cรณdigo completo โ–ผ
sistema_cadastro_json.py Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import json

ARQUIVO = "alunos.json"

# 1. carrega os dados do arquivo (se existir)
try:
    with open(ARQUIVO, "r", encoding="utf-8") as f:
        alunos = json.load(f)
    print(f"๐Ÿ“‚ Carreguei {len(alunos)} aluno(s) salvos.")
except FileNotFoundError:
    alunos = []
    print("๐Ÿ“ญ Nenhum cadastro ainda. Comeรงando do zero.")


while True:
    print("\n=== Sistema de Cadastro ===")
    print("1 - Adicionar aluno")
    print("2 - Listar alunos")
    print("3 - Buscar aluno")
    print("4 - Sair (e salvar)")

    opcao = input("Escolha uma opรงรฃo: ")

    if opcao == "1":
        nome  = input("Nome: ")
        idade = int(input("Idade: "))
        curso = input("Curso: ")
        alunos.append({"nome": nome, "idade": idade, "curso": curso})
        print(f"โœ… {nome} cadastrado(a)!")

    elif opcao == "2":
        if not alunos:
            print("๐Ÿ“ญ Nenhum aluno cadastrado ainda.")
        for a in alunos:
            print(f"๐Ÿ‘ค {a['nome']} โ€” {a['idade']} anos โ€” {a['curso']}")

    elif opcao == "3":
        alvo = input("Nome a buscar: ")
        encontrados = [a for a in alunos if a["nome"].lower() == alvo.lower()]
        print(encontrados if encontrados else "๐Ÿ˜ถ Nรฃo encontrei.")

    elif opcao == "4":
        with open(ARQUIVO, "w", encoding="utf-8") as f:
            json.dump(alunos, f, indent=4, ensure_ascii=False)
        print("๐Ÿ’พ Dados salvos. Atรฉ mais!")
        break

    else:
        print("โ“ Opรงรฃo invรกlida.")
primeira execuรงรฃo ยท sistema_cadastro_json.py

=== Sistema de Cadastro ===
Escolha uma opรงรฃo:
Nome:
Idade:
Curso:

Escolha uma opรงรฃo:
segunda execuรงรฃo (no dia seguinte!) ยท sistema_cadastro_json.py

=== Sistema de Cadastro ===
Escolha uma opรงรฃo:
๐ŸŽ‰
SENTIU? Fechou e abriu de novo, e a Ana tava lรก. Esse รฉ o momento exato em que seus programas deixam de ser brincadeira e viram software de verdade. Bem-vindo(a) ao mundo da persistรชncia! ๐Ÿ’พ
๐Ÿค“
Curiosidade pra quem tรก ligado: esse padrรฃo de "carregar tudo na memรณria โ†’ modificar โ†’ salvar tudo de novo" funciona pra cadastros pequenos (atรฉ umas centenas de itens). Quando passar disso, a gente quer algo melhor โ€” e รฉ exatamente o que vem no Cap 09. ๐Ÿ˜‰
โœ…
Resumo do Capรญtulo 08
O que vocรช acabou de desbloquear
๐Ÿ“ฆ import json Mรณdulo built-in do Python โ€” nรฃo instala nada
๐Ÿ’พ json.dump Salva (despeja) lista/dict num arquivo .json
๐Ÿ“– json.load Carrega (lรช) o arquivo .json de volta pra memรณria
๐Ÿ“‚ with open() Abre o arquivo e fecha sozinho no fim do bloco
โœ๏ธ modo "w" Escrita โ€” sobrescreve o arquivo
๐Ÿ“– modo "r" Leitura โ€” sรณ lรช, nรฃo modifica
๐Ÿ›ก๏ธ try/except FileNotFoundError Trata "arquivo ainda nรฃo existe" sem quebrar
๐Ÿ› BugZilla import esquecido, arquivo vazio, modo errado

"Agora seus programas TรŠM MEMร“RIA.
Fechou? Abriu? Tรก tudo lรก." ๐Ÿ’พโœจ

๐ŸŒ‰ Ponte pro prรณximo capรญtulo

JSON รฉ fantรกstico โ€” simples, universal, funciona em qualquer projeto pequeno. Mas tem um detalhe: a gente sempre carrega o arquivo INTEIRO na memรณria, modifica, e salva o arquivo INTEIRO de novo.

Isso รฉ tranquilo pra 10, 100, 500 alunos. Mas se vocรช cresce pra 10 mil cadastros? Aรญ jรก vira lerdeza. E se duas pessoas mexerem ao mesmo tempo? Bagunรงa.

ร‰ aรญ que entra o TinyDB โ€” um banco de dados de bolso que ainda usa JSON por baixo dos panos, mas oferece insert, search, update, remove de forma profissional. Vai parecer mรกgica depois do que vocรช acabou de aprender. ๐Ÿš€

Prรณximo capรญtulo โ†’

Capรญtulo 09 โ€” TinyDB. Persistรชncia de nรญvel profissional, ainda em arquivo, mas com superpoderes. Vocรช vai amar.

๐Ÿ—ƒ๏ธ Ir para Capรญtulo 09 โ†’

ou โ† voltar ao hub