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. ๐พ
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.
Onde moram suas variรกveis enquanto o programa roda.
Some quando fecha.
Onde a gente persiste os dados num arquivo.
Permanece pra sempre.
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.
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. ๐
Olha como รฉ parecido:
aluno = {
"nome": "Ana",
"idade": 22,
"ativo": True
}
{
"nome": "Ana",
"idade": 22,
"ativo": true
}
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.
Lembra da prateleira de fichas do Capรญtulo 07? Em JSON fica assim:
[
{
"nome": "Ana",
"idade": 22,
"curso": "Python"
},
{
"nome": "Joรฃo",
"idade": 28,
"curso": "IA"
}
]
Aqui รฉ a hora do "AHA!". Olha esse ciclo todo, do comeรงo ao fim:
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.
Dois exercรญcios guiados juntos โ primeiro a gente salva, depois lรช. No final, um desafio solo รฉpico pra unir tudo.
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 รฉ:
"w" de write)json.dump(dados, arquivo) โ a mรกgica acontece.json no seu projeto ๐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:
E ao lado do salvar_dados.py apareceu um arquivo novo:
[
{
"nome": "Ana",
"idade": 22,
"curso": "Python"
},
{
"nome": "Joรฃo",
"idade": 28,
"curso": "IA"
}
]
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).
"w": se o arquivo jรก existir,
ele รฉ SOBRESCRITO (apagado e regravado). ร o que a gente quer aqui โ
mas tรก ligado.
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:
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']}")
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. โจ
with open(...)?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. ๐ช
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 โ
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(...).
"r" pra ler,
"w" pra escrever. Depois, naturalmente, vocรช vai entender o resto.
Antes de surtar, confere essa lista โ quase sempre รฉ uma das trรชs coisas abaixo.
json
Vocรช comeรงa a digitar json.dump(...) e o Python solta:
NameError: name 'json' is not defined
import json.
Sem isso, o Python nรฃo sabe quem รฉ esse "json".
json.load
Vocรช cria alunos.json manualmente, deixa em branco, e tenta carregar:
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
[] (lista vazia) ou {} (dict vazio) dentro dele.
Ou entรฃo salva primeiro com json.dump([], arq).
"r" vs "w"
Tentou ler um arquivo que ainda nรฃo existe, com modo "r":
FileNotFoundError: [Errno 2] No such file or directory: 'alunos.json'
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 ๐.
alunos.json com modo "w" e ele jรก tinha dados. O que acontece?
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. ๐ช
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.")
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. ๐
Capรญtulo 09 โ TinyDB. Persistรชncia de nรญvel profissional, ainda em arquivo, mas com superpoderes. Vocรช vai amar.
๐๏ธ Ir para Capรญtulo 09 โ