Arquivos de texto e JSON

Persistir dados simples usando a biblioteca padrão.

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 json fornece as funções de serialização.
  • O primeiro with abre o arquivo para escrita e salva o dicionário.
  • ensure_ascii=False permite gravar caracteres Unicode legíveis no arquivo UTF-8.
  • indent=2 deixa o JSON formatado para humanos.
  • O segundo with lê 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.

  1. Execute em uma pasta de laboratório e observe os arquivos criados.
  2. Abra dados.json em editor de texto e compare com o dicionário Python.
  3. Altere o arquivo manualmente para um JSON válido e carregue novamente.
  4. 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.