TransWikia.com

Arquivo sendo escrito em diversas listas!

Stack Overflow em Português Asked by PedroPoiate on December 20, 2021

Estou desenvolvendo um programa simples em python, onde eu preciso gerenciar o estoque de uma loja.
Quando tento fazer com que os produtos sejam salvos em uma unica lista, eles acabam sendo salvos em diversas, impossibilitando a leitura no .txt para a pesquisa dos produtos!
Alguém consegue me ajudar? Estou travado nisso à umas 8 horas.
O programa é simples e tem que ser feito em python, para um trabalho de faculdade.
OBRIGADO!!

import sys, json


arquivo = open('LOJA.txt', 'a+')
print("### Loja do Iago e Do Pedro ###")

produto=[] 

def menu():
    opcao = int(input('### MENU ###n1-Cadastro de Produtosn2-Pesquisar Produtosn3-Alterar um Produton4-Remover um Produton5-Listar Produtos em Ordem ALFABÉTICAn6-Listar Produtos Por CÓDIGOn'))
    if opcao==1:
        cadastro()
    elif opcao==2:
        nome=input('Digite o nome do produto: ')
        pesquisa(nome)
    elif opcao==3:
        alterar()
    elif opcao==4:
        nome=input('Digite o nome do produto que voce deseja remover: ')
        Remover(nome)
    elif opcao==5:
        alfabetica()
    elif opcao==6:
        codigos()
         
    

def cadastro():
    # arquivo = open('LOJA.txt', 'a+')
    qtd=int(input('Quantidade de produtos a serem cadastrados: '))
    for x in range(qtd):
        produto=[]
        nome = input('Nome do produto: ')
        codigo = input('Codigo do produto: ')
        quantidade = input('Quantidade do produto: ')
        produto = json.dumps((nome, codigo, quantidade))
        with open('LOJA.txt', 'a+') as file:
            file.write(str(produto)) 
    file.close()
 

def pesquisa(nome):
    # arquivo = open('LOJA.txt', 'r')
    produto = []
    with open('LOJA.txt','r') as file:
        produto = arquivo.readlines() # readlinesssssss
        # produto = eval(file.read())
        for i in range(len(produto)):
            if nome in produto[i][0]:
                print('Nome: %snCódigo: %snQuantidade: %s' % (produto[i][0], produto[i][1], produto[i][2]))
            else:
                print('Produto não encontrado!')
    file.close()

def alterar():
    arquivo = open('LOJA.txt', 'a+')
    produto = []
    with open('LOJA.txt','a+') as file:
        produto = eval(file.read())
    for i in range(len(produto)):
        if nome in produto[i][0]:
           print('Nome: %snCódigo: %snQuantidade: %s' % (produto[i][0], produto[i][1], produto[i][2]))
        else:
            print('Produto não encontrado!')
    file.close()

def Remover(nome):
    arquivo = open('LOJA.txt', 'w+')
    produto = []
    with open('LOJA.txt','r') as file:
        produto = eval(file.read())
        # produto = json.load(file)
    for i in range(len(produto)):
        if nome in produto[i][0]:
            del produto[i]
        else:
            print('Produto não encontrado')                
    file.close()

def alfabetica():
    arquivo = open('LOJA.txt', 'r')
    with open('LOJA.txt','r') as file:
        produtos=eval(file.read())
        produto_ordenados = sorted(produtos)
        print(produto_ordenados)
    file.close()

def codigos():
    arquivo = open('LOJA.txt', 'r')
    with open('LOJA.txt','r') as file:
        produto=eval(file.read())
        produtos=[produto]
        codigos_ordenados = sorted(produtos)
        print(codigos_ordenados)
    file.close()    
menu()      

2 Answers

O problema é que na hora de cadastrar você está salvando tudo na mesma linha. Para o código funcionar é necessário salvar utilizando a quebra de linha (assumindo que você quer lê o arquivo por linha na pesquisa).

Desta forma em sua função de cadastro seu código deve ser modificado para salvar por linhas.

file.write('{}n'.format(produto))

Repare que em minha solução eu usei a função format da classe string para salvar com a quebra de linha (n).

Agora o seu arquivo LOJA.txt será salvo por linhas. Ex:

["a", "1", "0"]
["b", "2", "10"]
["c", "3", "100"]

A sua função de pesquisa deve ser reescrita.
def pesquisa(nome):
    # arquivo = open('LOJA.txt', 'r')
    produto = []
    with open('LOJA.txt','r') as file:
        produto = file.readlines() # readlinesssssss
        # produto = eval(file.read())
        for i in range(len(produto)):
            item = json.loads(i)
            if nome in item[0]:
                return print('Nome: %snCódigo: %snQuantidade: %s' % (item[0], item[1], item[2]))
        print('Produto não encontrado!')
    file.close()

Repare as mudanças:

  1. Substituí produto = arquivo.readlines() por produto = file.readlines()

Apenas para corrigir uma referencia a uma variável comentada.

  1. Adicionei a linha item = json.loads(i)

Temos que inserir essa linha pois no momento de fazer o cadastro, você executa um json.dumps. Desta forma para recuperar esta informação devemos utilizar o json.loads. Segue a documentação para json do python

Devido a esta mudança modifiquei um pouco como é iterado objetos, mas tentei deixar o mais parecido com o código que disponibilizou. Segue a versão final em destaque:

for i in range(len(produto)):
    item = json.loads(i)
        if nome in item[0]:
            return print('Nome: %snCódigo: %snQuantidade: %s' % (item[0], item[1], item[2]))
print('Produto não encontrado!')

Nesta implementação eu adicionei um return ao encontrar um elemento. E movi o código que mostra a mensagem de não encontrado para fora do comando iterativo for.

Answered by Danizavtz on December 20, 2021

Dúvida: Precisa realmente ser um .txt? Te recomendo salvar em um .csv, é mais fácil de lidar tanto para o programa quanto para o usuário.

Resolvendo: Na parte de cadastro você precisaria salvar com a vírgula. Agora na parte da pesquisa:

def pesquisa(nome):
    produto = []
    with open('LOJA.txt','r') as file:
        produto = file.read()
        # produto = eval(file.read())
        for i in range(len(produto)):
            if nome in produto[i][0]:
                print('Nome: %snCódigo: %snQuantidade: %s' % (produto[i][0], produto[i][1], produto[i][2]))
            else:
                print('Produto não encontrado!')
    file.close()

o valor de produto é uma string e não uma lista como você espera, você teria que tratar antes.

-> if nome in produto[i][0]:
(Pdb) i
0
(Pdb) produto[i]
'["Teste", "123", "2"]["Teste 2", "321", "5"]["asdf", "qwer", "2"]'

Qualquer dúvida pode me mandar mensagem que te ajudo.

Answered by vilelf on December 20, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP