Archive being written in several lists!

Asked

Viewed 36 times

-1

I am developing a simple program in python, where I need to manage the stock of a store. When I try to have the products saved in a single list, they end up being saved in several, making it impossible to read the . txt for product research! Can anyone help me? I’ve been stuck in this for about eight hours. The program is simple and has to be done in python, for a college job. THANK YOU!!

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 Produtos\n2-Pesquisar Produtos\n3-Alterar um Produto\n4-Remover um Produto\n5-Listar Produtos em Ordem ALFABÉTICA\n6-Listar Produtos Por CÓDIGO\n'))
    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: %s\nCódigo: %s\nQuantidade: %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: %s\nCódigo: %s\nQuantidade: %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()      
  • I took a look at your program.. From what I understand you’re conflicted with the list global Products and the list local (created within a function) Products. My suggestion is to change the names of the lists, all have the same name, ai vc vi encontrar onde a lista esta sendo re-escrita onde não deve.

  • I suggest you work with local lists only, strip the produto = [ ] on line 4 and works with the lists within the functions. in case you need to use a local list elsewhere, return the list or put as global (otherwise)

2 answers

0

Doubt: It really needs to be a .txt? I recommend you save in one .csv, is easier to handle for both program and user.

Solving: In the registration part you would need to save with the comma. Now in the search part:

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: %s\nCódigo: %s\nQuantidade: %s' % (produto[i][0], produto[i][1], produto[i][2]))
            else:
                print('Produto não encontrado!')
    file.close()

the value of produto is a string and not a list as you expect, you would have to deal with before.

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

Any questions can send me a message that I help you.

0

The problem is that when registering you are saving everything on the same line. For code to work it is necessary to save using line break (assuming you want to read the file per line in the search).

This way in your registration function your code must be modified to save by lines.

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

Note that in my solution I used the function format class string to save with line break (\n).

Now your file LOJA.txt will be saved by lines. Ex:

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

Your search function should be rewritten.
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: %s\nCódigo: %s\nQuantidade: %s' % (item[0], item[1], item[2]))
        print('Produto não encontrado!')
    file.close()

Notice the changes:

  1. I replaced produto = arquivo.readlines() for produto = file.readlines()

Only to correct a reference to a commented variable.

  1. I added the line item = json.loads(i)

We have to insert this line because when doing the cadastro, you perform a json.dumps. In this way to recover this information we must use the json.loads. Follow the documentation to python json

Due to this change I modified a little how is iterated objects, but I tried to make it more like the code that provided. Follow the final featured version:

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

In this implementation I added a Return when finding an element. And I moved the code that shows the não encontrado out of the iterative command for.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.