Modelo de Função salvar
- Modelo de função simples e direta em Python para salvar a lista de bicicletas em um arquivo de texto.
- A função utiliza o gerenciador de contexto with (que garante que o arquivo seja fechado corretamente) e formata os dados em colunas para facilitar a leitura.
def salvar_cadastro_bicicletas(lista_bicicletas, nome_arquivo="bicicletas.txt"):
"""
Salva uma lista de dicionários contendo o cadastro de bicicletas em um arquivo .txt.
Cada bicicleta deve ser um dicionário com as chaves: 'cor', 'modelo' e 'ano'.
"""
try:
with open(nome_arquivo, "w", encoding="utf-8") as arquivo:
# Escreve o cabeçalho do arquivo
arquivo.write(f"{'MODELO':<20} | {'COR':<15} | {'ANO':<5}\n")
arquivo.write("-" * 46 + "\n")
# Escreve os dados de cada bicicleta
for bike in lista_bicicletas:
modelo = bike.get('modelo', 'N/A')
cor = bike.get('cor', 'N/A')
ano = bike.get('ano', 'N/A')
arquivo.write(f"{modelo:<20} | {cor:<15} | {ano:<5}\n")
print(f"Cadastro salvo com sucesso em '{nome_arquivo}'!")
except IOError as e:
print(f"Erro ao salvar o arquivo: {e}")
# --- Exemplo de Uso ---
if __name__ == "__main__":
# Lista de exemplo com o cadastro das bicicletas
minhas_bikes = [
{"modelo": "Mountain Bike X", "cor": "Preto", "ano": 2024},
{"modelo": "Speed Pro", "cor": "Vermelho", "ano": 2025},
{"modelo": "Urbana Vintage", "cor": "Verde Oliva", "ano": 2023}
]
# Chamada da função
salvar_cadastro_bicicletas(minhas_bikes)Como o arquivo final vai ficar:
MODELO | COR | ANO
----------------------------------------------
Mountain Bike X | Preto | 2024
Speed Pro | Vermelho | 2025
Urbana Vintage | Verde Oliva | 2023 Para evoluir o código
- Salvar em formato CSV ou JSON (que são melhores para carregar os dados de volta para o Python depois).
- Adicionar uma função para ler o arquivo e exibir as bicicletas na tela.
- Criar um menu interativo no terminal para cadastrar novas bicicletas antes de salvar.
Salvar no formato CSV
- Salvar no formato CSV (Comma-Separated Values) é uma escolha excelente, pois o arquivo gerado pode ser aberto diretamente no Excel, Google Sheets ou reimportado facilmente para o Python.
- A forma mais eficiente e segura de fazer isso é utilizando o módulo nativo csv do Python.
import csv
def salvar_cadastro_csv(lista_bicicletas, nome_arquivo="bicicletas.csv"):
"""
Salva uma lista de dicionários contendo o cadastro de bicicletas em um arquivo .csv.
"""
# Define os nomes das colunas (cabeçalho) com base nas chaves do dicionário
campos = ['modelo', 'cor', 'ano']
try:
# 'newline=""' impede linhas em branco extras no Windows
with open(nome_arquivo, "w", newline="", encoding="utf-8") as arquivo:
# Cria o gravador de dicionários do módulo csv
escritor = csv.DictWriter(arquivo, fieldnames=campos, delimiter=';')
# Escreve o cabeçalho (modelo;cor;ano)
escritor.writeheader()
# Escreve todas as linhas da lista de uma vez
escritor.writerows(lista_bicicletas)
print(f"Cadastro salvo com sucesso em '{nome_arquivo}'!")
except IOError as e:
print(f"Erro ao salvar o arquivo CSV: {e}")
# --- Exemplo de Uso ---
if __name__ == "__main__":
minhas_bikes = [
{"modelo": "Mountain Bike X", "cor": "Preto", "ano": 2024},
{"modelo": "Speed Pro", "cor": "Vermelho", "ano": 2025},
{"modelo": "Urbana Vintage", "cor": "Verde Oliva", "ano": 2023}
]
salvar_cadastro_csv(minhas_bikes)💡 Por que usamos o ponto e vírgula (;) como delimitador?
Por padrão, o CSV usa a vírgula ( , ). Porém, em sistemas operacionais configurados em português (como o Windows no Brasil), o Excel usa a vírgula como separador decimal (ex: R$ 10,50). Usar o ponto e vírgula (;) garante que o Excel abra o arquivo dividindo as colunas corretamente de primeira, sem desconfigurar o texto.
Salvar no formato JSON
Salvar no formato JSON (JavaScript Object Notation) é a melhor opção se você pretende ler esses dados de volta no Python mais tarde ou usá-los em uma aplicação web, pois ele preserva a estrutura de dados (lista de dicionários) perfeitamente.
Para isso, usamos o módulo nativo json do Python.
import json
def salvar_cadastro_json(lista_bicicletas, nome_arquivo="bicicletas.json"):
"""
Salva uma lista de dicionários contendo o cadastro de bicicletas em um arquivo .json.
"""
try:
with open(nome_arquivo, "w", encoding="utf-8") as arquivo:
# indent=4 deixa o arquivo visualmente organizado (com quebras de linha e recuos)
# ensure_ascii=False garante que acentos (como em 'Vermelho') sejam salvos corretamente
json.dump(lista_bicicletas, arquivo, indent=4, ensure_ascii=False)
print(f"Cadastro salvo com sucesso em '{nome_arquivo}'!")
except IOError as e:
print(f"Erro ao salvar o arquivo JSON: {e}")
# --- Exemplo de Uso ---
if __name__ == "__main__":
minhas_bikes = [
{"modelo": "Mountain Bike X", "cor": "Preto", "ano": 2024},
{"modelo": "Speed Pro", "cor": "Vermelho", "ano": 2025},
{"modelo": "Urbana Vintage", "cor": "Verde Oliva", "ano": 2023}
]
salvar_cadastro_json(minhas_bikes)Como o arquivo final vai ficar
O arquivo bicicletas.json será gerado exatamente assim, mantendo o formato original do seu código:
[
{
"modelo": "Mountain Bike X",
"cor": "Preto",
"ano": 2024
},
{
"modelo": "Speed Pro",
"cor": "Vermelho",
"ano": 2025
},
{
"modelo": "Urbana Vintage",
"cor": "Verde Oliva",
"ano": 2023
}
]Agora que vimos TXT, CSV e JSON, o que fazer a seguir?
- Criar a função para ler o arquivo JSON de volta para o Python?
- Desenvolver um menu interativo no terminal para cadastrar as bicicletas antes de salvar?
- Adicionar validações (como não permitir anos futuros ou campos vazios)?
Salvando em um banco de dados SqLite
- Para salvar os dados em um banco de dados SQLite, utilizamos o módulo nativo sqlite3 do Python. Ao contrário dos arquivos de texto, CSV ou JSON, o banco de dados armazena as informações de forma estruturada em uma tabela, permitindo buscas e atualizações muito mais rápidas.
- A abordagem ideal é criar uma função que garanta a existência da tabela antes de inserir os dados, evitando erros caso o banco seja novo.
import sqlite3
def salvar_cadastro_sqlite(lista_bicicletas, nome_banco="bicicletas.db"):
"""
Salva uma lista de dicionários contendo o cadastro de bicicletas em um banco de dados SQLite.
"""
conexao = None
try:
# Conecta ao arquivo do banco de dados (será criado se não existir)
conexao = sqlite3.connect(nome_banco)
cursor = conexao.cursor()
# 1. Cria a tabela caso ela ainda não exista
cursor.execute("""
CREATE TABLE IF NOT EXISTS bicicletas (
id INTEGER PRIMARY KEY AUTOINCREMENT,
modelo TEXT NOT NULL,
cor TEXT NOT NULL,
ano INTEGER NOT NULL
)
""")
# 2. Prepara o comando SQL de inserção
# Usamos '?' (placeholders) para evitar vulnerabilidades de SQL Injection
comando_inserir = "INSERT INTO bicicletas (modelo, cor, ano) VALUES (?, ?, ?)"
# 3. Transforma a lista de dicionários em uma lista de tuplas para inserção em lote
dados_tuplas = [
(bike.get('modelo'), bike.get('cor'), bike.get('ano'))
for bike in lista_bicicletas
]
# Executa a inserção de todas as bicicletas de uma vez só
cursor.executemany(comando_inserir, dados_tuplas)
# Salva (confirma) as alterações no banco de dados
conexao.commit()
print(f"Cadastro de {len(lista_bicicletas)} bicicleta(s) salvo com sucesso no banco '{nome_banco}'!")
except sqlite3.Error as e:
print(f"Erro no banco de dados SQLite: {e}")
if conexao:
conexao.rollback() # Cancela as alterações em caso de erro
finally:
# Garante que a conexão com o banco será fechada
if conexao:
conexao.close()
# --- Exemplo de Uso ---
if __name__ == "__main__":
minhas_bikes = [
{"modelo": "Mountain Bike X", "cor": "Preto", "ano": 2024},
{"modelo": "Speed Pro", "cor": "Vermelho", "ano": 2025},
{"modelo": "Urbana Vintage", "cor": "Verde Oliva", "ano": 2023}
]
salvar_cadastro_sqlite(minhas_bikes)🔍 Vantagens desta abordagem:
IF NOT EXISTS: Você pode rodar o script dezenas de vezes; ele só criará a tabela na primeira execução.executemany: Insere centenas de registros de uma só vez, o que é infinitamente mais rápido do que fazer um execute dentro de um laço for.commiterollback: Se ocorrer um erro no meio do salvamento, o rollback garante que o banco não fique com dados corrompidos ou incompletos.
Para avançar no uso do banco de dados,
- Criar uma função para buscar e listar as bicicletas salvas no SQLite?
- Aprender a fazer filtros (como buscar apenas bicicletas de uma cor específica)?
- Criar uma função para deletar ou atualizar uma bicicleta pelo ID?