S05 - Projeto: Mercearia
Finalidade
Prove que você pode desenvolver um programa Python que lê arquivos CSV e cria, preenche e usa um dicionário.
Projeto
Não use IA para gerar o código deste programa.
Usar IA para gerar este programa é uma violação da política de IA do curso e pode resultar em nota zero na atividade, reprovação na disciplina ou até remoção do programa.
Se você precisar de ajuda com a atividade ou tiver dúvidas sobre o uso de IA, por favor pergunte ao seu instrutor.
Contexto
Seu tio tem uma mercearia e acabou de começar a usar um serviço online que permite que os clientes façam pedidos de compras pela internet. Depois que um cliente conclui um pedido, o serviço online envia um arquivo CSV que contém o pedido dele para a mercearia. Seu tio pediu para você escrever um programa que leia o arquivo CSV e exiba na janela do terminal um recibo que lista os itens comprados e mostra o subtotal, o valor do imposto sobre vendas e o total.
Requisitos
O programa deve ler dois arquivos csv, o pedido do cliente e um catálogo de produtos. Cada item do pedido do cliente será pesquisado no catálogo de produtos para obter o preço atual. Já o pedido será exibido no terminal que mostra os detalhes do pedido do cliente. Use os seguintes dados para criar o programa.
- Leia o inventário de produtos do arquivo
produtos.csv. - Leia o pedido do cliente no arquivo
pedido.csv - Para cada item do pedido, pesquise o produto no catálogo e use as informações do catálogo para calcular e exibir o pedido.
- Exiba o recibo do pedido.
- Exiba o nome da loja (você escolhe o nome) na parte superior do recibo.
- Exiba a lista de itens pedidos. Inclua o nome do item, a quantidade pedida e o preço por item.
- Some e exiba o número de itens pedidos.
- Some e exiba o subtotal devido.
- Calcule e exiba o valor do imposto sobre vendas. Use 6% como alíquota do imposto.
- Calcule e exiba o valor total devido.
- Exiba uma mensagem de agradecimento.
- Obtenha a data e a hora atuais do sistema operacional do seu computador e as exiba. Você pode acessar o conteúdo da semana 1 - Documentação Útil para relembrar como fazer isso.
- Inclua um bloco
trye blocosexceptpara lidar comFileNotFoundError,PermissionErroreKeyError.
Design
A maior parte do trabalho deste programa é realizado na função main. Certifique-se de incluir o tratamento de erros conforme descrito nos requisitos .
Especificações das Funções
| Nome da Função | Tipo de Retorno de Parâmetros | Descrição |
|---|---|---|
| ler_dicionario | Parâmetros filename, indice_coluna_chave Tipo de Retorno Dicionário |
Esta função lê os dados do produto do arquivo csv passado para a função no parâmetro filename. A chave do dicionário está contida na coluna de dados csv indicada pelo parâmetro indice_coluna_chave, o valor de cada item do dicionário é a lista derivada dos valores na linha do arquivo csv. A função retorna um dicionário de produtos. |
| main | Lê o arquivo recibo.csv, processa esse arquivo e exibe o recibo de acordo com os requisitos. |
Informações úteis.
-
O artigo Leitura de Arquivos explica como configurar o VS Code para que seu programa Python possa ler um arquivo de texto.
-
O conteúdo de preparação desta aula mostra como ler o conteúdo de um arquivo CSV em um dicionário composto e como ler e processar um arquivo CSV sem armazená-lo em um dicionário.
-
O conteúdo de preparação da semana 4 explica como encontrar um item em um dicionário.
-
Reveja o vídeo Atividade de Aprendizagem: Coleções que ensina sobre listas e dicionários.
Etapa
Comece seu projeto escrevendo e testando a função ler_dicionario.
- Crie uma pasta para o projeto desta semana e dê a ela o nome que você quiser.
- Abra a pasta que você acabou de criar no VSCode.
- Baixe ambos os arquivos
produtos.csvepedido.csve salve-os na pasta do seu projeto. - Abra o arquivo
produtos.csvno VS Code e examine-o. Observe que cada linha neste arquivo contém três valores separados por vírgulas: um número do produto, um nome de produto e um preço de varejo. Observe também que cada número do produto no arquivoprodutos.csvé único. Isso significa que seu programa pode ler o arquivoprodutos.csvem um dicionário e usar os números dos produtos como chaves no dicionário. - Crie um arquivo chamado
recibo.pyna pasta do seu projeto. - Crie a função
ler_dicionario. Ela deve abrir um arquivo CSV para leitura e usar umcsv.readerpara ler cada linha e preencher um dicionário composto com o conteúdo do arquivoprodutos.csv. - Crie a função
maine adicione os seguintes recursos.- Chama a função
ler_dicionarioe armazene o dicionário retornado na variável dic_produtos. - Exibe o dicionário.
- Abre o arquivo
pedido.csvpara leitura. - Pula a primeira linha do arquivo
pedido.csvporque ela contém títulos de coluna. - Usa um loop para ler e processar cada linha do arquivo
pedido.csv. Dentro do corpo do loop, seu programa deve fazer o seguinte para cada linha:- Usar o número do produto solicitado para encontrar o item correspondente no dic_produtos.
- Exibir o nome do produto, a quantidade solicitada e o preço do produto.
- Chama a função
- Na parte inferior do seu arquivo
recibo.py, adicione uma chamada para a funçãomain. Certifique-se de proteger a chamada paramaincom uma instruçãoif, conforme ensinado no conteúdo de preparação da semana 3.
Procedimento de Teste
Verifique se seu programa funciona corretamente seguindo cada etapa deste procedimento de teste:
- Baixe o arquivo
test_produtos.pye salve-o na mesma pasta onde você salvou seu programarecibo.py. Execute o arquivotest_produtos.pye certifique-se de que a funçãotest_leitura_do_dicionarioseja aprovada. Se não passar, há um erro na sua funçãoler_dicionario. Leia a saída depytest, corrija o erro e execute o arquivotest_produtos.pynovamente até que a função de teste seja aprovada.> python test_produtos.py ==================== test session starts ====================== platform win32--Python 3.8.6, pytest-6.1.2, py-1.9.0, pluggy rootdir: C:\Usuários\cse111\semana05 collected 1 item test_produtos.py::test_leitura_do_dicionario PASSED [100%] ===================== 1 passed in 0.12s ======================
- Execute seu programa e verifique se ele exibe o dicionário de produtos e os itens solicitados, conforme mostrado no exemplo de saída abaixo.
> python recibo.py Todos os Produtos {'D150': ['D150', '1 litro de leite', '2.85'], 'D083': ['D083', '1 copo de iogurte', '0.75'], 'D215': ['D215', '450g de queijo cheddar', '3.35'], 'P019': ['P019', 'alface americana', '1.15'], 'P020': ['P020', 'alface crespa', '1.79'], 'P021': ['P021', 'alface manteiga', '1.83'], 'P025': ['P025', 'embalagem de rúcula (227g)', '2.19'], 'P143': ['P143', '450g de mini cenouras', '1.39'], 'W231': ['W231', 'pacote de granola (907g)', '3.21'], 'W112': ['W112', 'pão de trigo', '2.55'], 'C013': ['C013', 'barrinha de chocolate Twix', '0.85'], 'H001': ['H001', '8 rolos de papel higiênico', '6.45'], 'H014': ['H014', '1 caixa de cotonetes (75 unidades)', '2.49'], 'H020': ['H020', '1 esponja de limpeza', '2.39'], 'H021': ['H021', 'frasco de detergente (354ml)', '3.19'], 'H025': ['H025', 'limpador de vaso sanitário', '4.50']} Itens Pedidos pão de trigo: 2 @ 2.55 1 copo de iogurte: 4 @ 0.75 pacote de granola (907g): 1 @ 3.21 barrinha de chocolate Twix: 2 @ 0.85 1 copo de iogurte: 3 @ 0.75
Envio de Etapa
Na data de entrega ou antes dela, retorne ao Canvas e reporte seu progresso nesta etapa.
Conclusão do Projeto
Conclua seu projeto completando a função main. Certifique-se de que seu código atenda a TODOS os requisitos especificados acima.
- Remova a linha que exibe o dicionário do produto.
- Adicione o código restante necessário para atender ao requisito 4 do usuário.
Informações Úteis
- O conteúdo de preparação desta aula explica como encontrar itens em um dicionário.
Teste
Verifique se seu programa funciona corretamente seguindo cada etapa deste procedimento de teste:
- Execute seu programa e verifique se ele exibe um recibo formatado de forma semelhante ao mostrado abaixo. Seu programa deve exibir a data e a hora atuais exatamente com a mesma formatação mostrada abaixo. Além disso, verifique se o seu programa calcula o número de itens, o subtotal, o imposto sobre vendas e o total, conforme mostrado abaixo.
t; python recibo.py Empório Inkom pão de trigo: 2 @ 2.55 1 copo de iogurte: 4 @ 0.75 pacote de granola (907g): 1 @ 3.21 barrinha de chocolate Twix: 2 @ 0.85 1 copo de iogurte: 3 @ 0.75 Número de itens: 12 Subtotal: 15.26 Imposto sobre vendas: 0.92 Total: 16.18 Obrigado por comprar no Empório Inkom. 10/04/2025 05:10:30
-
Verifique se o bloco
exceptpara lidar comKeyErrorque você adicionou ao seu programa funciona corretamente fazendo o seguinte:- Adicione temporariamente a seguinte linha ao final do seu arquivo
pedido.csve salve o arquivo.R002,5
- Execute o programa novamente e verifique se ele exibe uma mensagem de erro como a mostrada abaixo.
> python recibo.py Error: unknown product ID in the request.csv file 'R002'
Dica: se você escreveu um blocoexceptno seu programa para lidar comKeyErrore adicionou "R002,5" ao arquivopedido.csv, depois salvou o arquivopedido.csve executou programa, mas ele não está gerandoKeyError, então verifique em seu programa se você escreveu uma instruçãoifantes da instrução que encontra um valor no dicionário de produtos. Procure um código semelhante a este:Se o seu programa contiver uma instruçãoif num_prod in dic_produtos: lista_infos_produtos = dic_produtos[num_prod] ⋮ifsemelhante à acima, então a instruçãoifprovavelmente está impedindo o seu programa de gerar umKeyError. Exclua a instruçãoif, desfaça o recuo das linhas de código dentro da instruçãoife teste seu programa novamente.
- Adicione temporariamente a seguinte linha ao final do seu arquivo
-
Verifique se o bloco
exceptpara lidar comFileNotFoundErrorque você adicionou ao seu programa funciona corretamente fazendo o seguinte:-
Exclua temporariamente ou renomeie o arquivo
produtos.csv. -
Execute o programa novamente e verifique se ele exibe uma mensagem de erro como a mostrada abaixo.
> python recibo.py Error: missing file [Errno 2] No such file or directory: 'produtos.csv'
-
Desafios Adicionais
Se o seu programa atender aos requisitos para esta atividade, conforme descrito acima, você receberá 93% dos pontos possíveis. Para ganhar os 7% de pontos restantes, você precisará adicionar um ou mais recursos ao seu programa. Use sua criatividade. Adicione um comentário no topo do seu código que explique a(s) melhoria(s).
- Escreva um código para exibir um lembrete de quantos dias faltam para o início da Promoção de Ano Novo (1º de janeiro) na parte inferior do recibo.
- Faça o programa imprimir no final do recibo a data limite para devolução, que deve ser exatamente 30 dias depois da compra, às 21h.
- Desafio: Escreva um código que dará a você a opção de comprar um e ganhar 50% de desconto no item D083. Por exemplo, se o cliente pedir um item, o preço será integral. Se o cliente encomendar dois itens, o primeiro item será vendido pelo preço integral e o segundo terá um desconto de 50%. Para três itens, dois estariam pelo preço integral e um com 50% de desconto. Exiba o preço com desconto no recibo.
- Escreva um código que imprima um cupom de desconto no final do recibo. O código deve garantir que o cupom seja sempre para um dos produtos comprados pelo cliente.
Se você escolher adicionar recursos ao seu código, coloque um comentário no topo do seu arquivo descrevendo o que você fez para melhorar seu programa.
Envio do Projeto
Volte ao Canvas e envie seu arquivo recibo.py para que seu programa seja avaliado.
Se um erro impedir que seu programa seja executado até a conclusão, o avaliador atribuirá zero à tarefa e solicitará que você corrija e reenvie seu programa. Em outras palavras, em vez de enviar um programa que não funciona, é melhor pedir ajuda para entender como corrigir o problema antes de enviar seu programa.
Links Úteis:
- Voltar para: Visão Geral da Semana | Página Inicial