Criando uma Aplicação Prática - Gerador de Relatórios
Neste passo final, criaremos uma aplicação mais prática que demonstra como usar a função print() com redirecionamento de arquivo para gerar um relatório formatado. Este exemplo mostrará como essa técnica pode ser aplicada em cenários do mundo real.
Construindo um Gerador de Relatórios de Vendas
Vamos criar um script que gera um relatório de vendas com base em alguns dados de amostra:
- Crie um novo arquivo chamado
sales_report_generator.py no diretório /home/labex/project
- Adicione o seguinte código ao arquivo:
import datetime
## Dados de vendas de amostra (produto, quantidade, preço)
sales_data = [
{"product": "Laptop", "quantity": 5, "price": 899.99},
{"product": "Mouse", "quantity": 10, "price": 24.99},
{"product": "Keyboard", "quantity": 7, "price": 49.99},
{"product": "Monitor", "quantity": 3, "price": 149.99},
{"product": "Headphones", "quantity": 12, "price": 79.99}
]
def generate_sales_report(filename):
"""Gera um relatório de vendas formatado e o salva em um arquivo."""
today = datetime.datetime.now().strftime("%Y-%m-%d")
with open(filename, "w") as report_file:
## Imprime o cabeçalho do relatório
print("=" * 60, file=report_file)
print(f"RELATÓRIO DE VENDAS - Gerado em {today}", file=report_file)
print("=" * 60, file=report_file)
print("", file=report_file)
## Imprime o cabeçalho da tabela
print(f"{'Produto':<15} {'Quantidade':<10} {'Preço ($)':<10} {'Total ($)':<10}", file=report_file)
print("-" * 50, file=report_file)
## Imprime os dados de vendas e calcula os totais
grand_total = 0
total_items = 0
for item in sales_data:
product = item["product"]
quantity = item["quantity"]
price = item["price"]
total = quantity * price
print(f"{product:<15} {quantity:<10} {price:<10.2f} {total:<10.2f}", file=report_file)
grand_total += total
total_items += quantity
## Imprime o resumo
print("-" * 50, file=report_file)
print(f"{'Total':<15} {total_items:<10} {'':<10} {grand_total:<10.2f}", file=report_file)
print("", file=report_file)
print("=" * 60, file=report_file)
print("Fim do Relatório", file=report_file)
## Gera o relatório
report_filename = "sales_report.txt"
generate_sales_report(report_filename)
print(f"Relatório de vendas foi gerado: {report_filename}")
print("\nConteúdo do relatório de vendas:")
with open(report_filename, "r") as file:
print(file.read())
- Salve o arquivo e execute-o:
python3 sales_report_generator.py
Você deve ver uma saída que inclui:
Relatório de vendas foi gerado: sales_report.txt
Conteúdo do relatório de vendas:
============================================================
RELATÓRIO DE VENDAS - Gerado em 2023-09-10
============================================================
Produto Quantidade Preço ($) Total ($)
--------------------------------------------------
Laptop 5 899.99 4499.95
Mouse 10 24.99 249.90
Keyboard 7 49.99 349.93
Monitor 3 149.99 449.97
Headphones 12 79.99 959.88
--------------------------------------------------
Total 37 6509.63
============================================================
Fim do Relatório
Este exemplo demonstra como criar um relatório bem formatado usando a função print() com redirecionamento de arquivo. O relatório inclui cabeçalhos, dados formatados em um layout tabular e informações de resumo.
Criando um Sistema de Rotação de Log Dinâmico
Vamos criar mais um exemplo que demonstra um sistema de rotação de log, que cria um novo arquivo de log cada vez que o script é executado:
- Crie um novo arquivo chamado
rotating_log.py no diretório /home/labex/project
- Adicione o seguinte código ao arquivo:
import datetime
import os
def create_log_file():
"""Cria um novo arquivo de log com um timestamp no nome do arquivo."""
timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M%S")
log_dir = "logs"
## Cria o diretório de logs se ele não existir
if not os.path.exists(log_dir):
os.makedirs(log_dir)
return os.path.join(log_dir, f"log_{timestamp}.txt")
def log_event(log_file, event_type, message):
"""Registra um evento no arquivo de log especificado."""
timestamp = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with open(log_file, "a") as f:
print(f"[{timestamp}] [{event_type.upper()}] {message}", file=f)
## Cria um novo arquivo de log
log_filename = create_log_file()
print(f"Criado novo arquivo de log: {log_filename}")
## Simula alguns eventos do aplicativo
log_event(log_filename, "info", "Aplicativo iniciado")
log_event(log_filename, "info", "Inicializando módulos...")
log_event(log_filename, "warning", "Arquivo de configuração não encontrado, usando padrões")
log_event(log_filename, "info", "Processando lote de dados #1")
log_event(log_filename, "error", "Falha ao conectar ao servidor de banco de dados")
log_event(log_filename, "info", "Tentando reconectar em 5 segundos")
log_event(log_filename, "info", "Conexão estabelecida")
log_event(log_filename, "info", "Aplicativo encerrando")
print("\nConteúdo do arquivo de log:")
with open(log_filename, "r") as f:
print(f.read())
- Salve o arquivo e execute-o:
python3 rotating_log.py
Você deve ver uma saída semelhante a:
Criado novo arquivo de log: logs/log_20230910_153045.txt
Conteúdo do arquivo de log:
[2023-09-10 15:30:45] [INFO] Aplicativo iniciado
[2023-09-10 15:30:45] [INFO] Inicializando módulos...
[2023-09-10 15:30:45] [WARNING] Arquivo de configuração não encontrado, usando padrões
[2023-09-10 15:30:45] [INFO] Processando lote de dados #1
[2023-09-10 15:30:45] [ERROR] Falha ao conectar ao servidor de banco de dados
[2023-09-10 15:30:45] [INFO] Tentando reconectar em 5 segundos
[2023-09-10 15:30:45] [INFO] Conexão estabelecida
[2023-09-10 15:30:45] [INFO] Aplicativo encerrando
Este exemplo demonstra uma aplicação mais avançada da saída de arquivo em Python. Cada vez que o script é executado, ele cria um novo arquivo de log com um timestamp no nome, o que ajuda na organização e gerenciamento de logs.
Esses exemplos práticos mostram como redirecionar a saída da função print() para arquivos pode ser usado para criar aplicações úteis, como geradores de relatórios e sistemas de log. As técnicas que você aprendeu neste laboratório podem ser aplicadas a muitos cenários do mundo real onde você precisa salvar a saída do programa para referência ou análise posterior.