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()
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"]
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:
produto = arquivo.readlines()
por produto = file.readlines()
Apenas para corrigir uma referencia a uma variável comentada.
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
Get help from others!
Recent Answers
Recent Questions
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP