Arquivos de texto e JSON
Objetivo da aula
Persistir dados simples usando a biblioteca padrão.
Regra desta aula: vamos assumir que você nunca viu este assunto antes. Nenhum termo importante será usado sem explicação e todo exemplo deve ser entendido linha por linha, não apenas copiado.
Começando do zero
Variáveis desaparecem quando o processo termina. Para guardar dados entre execuções, podemos escrever em arquivos. Arquivos de texto armazenam caracteres; JSON representa estruturas como listas, dicionários, números, textos, booleanos e nulo em formato textual padronizado. Python possui o módulo json para converter entre objetos simples e JSON.
Uma imagem mental para entender
Imagine um quadro branco e um caderno. Variáveis são como anotações no quadro: úteis enquanto a aula acontece, mas podem ser apagadas ao final. O arquivo é o caderno: você escreve para consultar depois. JSON é uma forma organizada de escrever estruturas de dados nesse caderno.
Conceitos essenciais, sem pular etapas
with open(...)
Abre um arquivo e garante o fechamento ao sair do bloco, inclusive em muitos casos de erro.
Modo de leitura/escrita
"r" lê, "w" escreve substituindo o conteúdo existente. Existem outros modos, mas estes bastam para o fundamento.
Encoding UTF-8
Especificar encoding="utf-8" torna explícita a codificação textual usada nos exemplos.
json.dump()
Serializa um objeto Python compatível para arquivo JSON.
json.load()
Lê JSON e reconstrói estruturas Python compatíveis.
Caminho do arquivo
Caminhos relativos dependem da pasta atual de execução. Essa é uma fonte comum de “arquivo não encontrado”.
Modelo mental
OBJETO EM MEMÓRIA → SERIALIZAÇÃO → ARQUIVO → LEITURA → DESSERIALIZAÇÃO → OBJETO
Exemplo 1 — primeiro veja o programa inteiro
import json
dados = {
"nome": "Ana",
"tarefas": ["ler", "praticar"],
"ativo": True
}
with open("dados.json", "w", encoding="utf-8") as arquivo:
json.dump(dados, arquivo, ensure_ascii=False, indent=2)
with open("dados.json", "r", encoding="utf-8") as arquivo:
carregados = json.load(arquivo)
print(carregados["nome"])
print(carregados["tarefas"])
Agora vamos ler linha por linha
- O módulo
jsonfornece as funções de serialização. - O primeiro
withabre o arquivo para escrita e salva o dicionário. ensure_ascii=Falsepermite gravar caracteres Unicode legíveis no arquivo UTF-8.indent=2deixa o JSON formatado para humanos.- O segundo
withlê o arquivo e cria novamente um dicionário/listas em memória.
Saída esperada
Ana
['ler', 'praticar']
Exemplo 2 — o mesmo conceito em outra situação
with open("mensagem.txt", "w", encoding="utf-8") as arquivo:
arquivo.write("Olá, arquivo!\n")
with open("mensagem.txt", "r", encoding="utf-8") as arquivo:
conteudo = arquivo.read()
print(conteudo)
Antes de JSON, este exemplo mostra a ideia mais simples: gravar texto e ler texto. JSON acrescenta uma convenção para representar estruturas.
Experimento guiado
Não pule esta parte. Programação só começa a fazer sentido quando você prevê um resultado, executa e compara a previsão com o que realmente aconteceu.
- Execute em uma pasta de laboratório e observe os arquivos criados.
- Abra
dados.jsonem editor de texto e compare com o dicionário Python. - Altere o arquivo manualmente para um JSON válido e carregue novamente.
- Descubra a pasta atual com
pathlib.Path.cwd()se estiver em dúvida sobre onde o caminho relativo aponta.
Mini desafio
Salve uma lista de três tarefas em tarefas.json e depois carregue-a e mostre a quantidade de registros.
Solução comentada
import json
tarefas = [
{"titulo": "Ler", "concluida": False},
{"titulo": "Praticar", "concluida": True},
{"titulo": "Revisar", "concluida": False}
]
with open("tarefas.json", "w", encoding="utf-8") as arquivo:
json.dump(tarefas, arquivo, ensure_ascii=False, indent=2)
with open("tarefas.json", "r", encoding="utf-8") as arquivo:
carregadas = json.load(arquivo)
print("Quantidade:", len(carregadas))
Depois de executar a solução, altere pelo menos um valor e explique por que o novo resultado mudou. Se você só copiou e não consegue explicar cada linha, refaça o desafio em uma versão menor.
Erros comuns e por que acontecem
- Esperar que caminho relativo seja resolvido a partir da pasta onde o arquivo-fonte está, quando o processo foi iniciado em outra pasta.
- Usar modo
"w"e esquecer que ele substitui o conteúdo existente. - Editar JSON quebrando aspas, vírgulas ou estrutura e encontrar
JSONDecodeError. - Tentar serializar diretamente objetos que JSON não sabe representar sem conversão apropriada.
Cheque se você realmente entendeu
Por que usar with open?
Resposta: Para gerenciar o recurso de arquivo e garantir fechamento ao sair do bloco.
Qual a diferença entre variável e arquivo?
Resposta: A variável pertence ao estado do processo; o arquivo pode persistir dados após o processo terminar.
O que json.load() faz?
Resposta: Lê JSON de um arquivo e produz estruturas Python compatíveis.
Resumo em linguagem simples
Nesta aula, o ponto central foi Arquivos de texto e JSON. Tente explicar o modelo OBJETO EM MEMÓRIA → SERIALIZAÇÃO → ARQUIVO → LEITURA → DESSERIALIZAÇÃO → OBJETO sem olhar a tela. Depois, escreva um exemplo próprio menor que os apresentados. Esse exercício de explicação é parte do aprendizado, não um extra.
Conexão com a próxima aula
Na próxima aula, Módulos e import, vamos aproveitar exatamente o que foi construído aqui. Você não precisa memorizar tudo; precisa conseguir reconhecer o conceito e reconstruí-lo com raciocínio e testes.