1

I have a inventory program that works. I am trying to save out the data (item names and qty) which are held in a list called inventory. So they can be reused for the next time the program is launched and edited at a later date.

My inventory program code:

import os

class Inventory:
    def __init__(self):
        self.item = []
        self.qty = []
    def remove(self, name):
        ix = self.item.index(name)
        self.item.pop(ix)
        self.qty.pop(ix)

    def add(self, name, qty):
        self.item.append(name)
        self.qty.append(qty)

    def update(self, name, update):
        if update >= 0:
            self.qty[self.item.index(name)] += update
        elif update <= -1:
            self.qty[self.item.index(name)] += update

    def search(self, name):
        pos = self.item.index(name) if name in self.item else -1
        if pos >= 0:
            return self.item[pos], self.qty[pos]
        else:
            return None

    def __str__(self):
        out = ""
        zipo = list(zip(self.item, self.qty))
        for foobar in zipo:
            out += f"Item : {foobar[0]} \nQuantity : {foobar[1]}\n"
            out += "----------\n"
        return out


def menuDisplay():
    """Display the menu"""
    print('=============================')
    print('= Inventory Management Menu =')
    print('=============================')
    print('(1) Add New Item to Inventory')
    print('(2) Remove Item from Inventory')
    print('(3) Update Inventory')
    print('(4) Search Item in Inventory')
    print('(5) Print Inventory Report')
    print('(99) Quit')


def add_one_item(inventory):
    print('Adding Inventory')
    print('================')
    while True:
        try:
            new_name = input('Enter the name of the item: ')
            assert new_name.isalpha(), "Only letters are allowed!"
            new_qty = int(input("Enter the quantity of the item: "))
            inventory.add(new_name, new_qty)
            break
        except Exception as e:
            print("Invalid choice! try again! " + str(e))
            print()


def remove_one_item(inventory):
    print('Removing Inventory')
    print('==================')
    removing = input('Enter the item name to remove from inventory: ')
    inventory.remove(removing)


def ask_exit_or_continue():
    return int(input('Enter 98 to continue or 99 to exit: '))


def update_inventory(inventory):
    print('Updating Inventory')
    print('==================')
    item = input('Enter the item to update: ')
    update = int(input(
        "Enter the updated quantity. Enter 5 for additional or -5 for less: "))
    inventory.update(item, update)


def search_inventory(inventory):
    print('Searching Inventory')
    print('===================')
    search = input('Enter the name of the item: ')
    result = inventory.search(search)
    if result is None:
        print("Item not in inventory")
    else:
        name, qty = result
        print('Item:     ', name)
        print('Quantity: ', qty)
        print('----------')


def print_inventory(inventory):
    print('Current Inventory')
    print('=================')
    print(inventory)


def main():
    inventory = Inventory()
    while True:
        try:
            menuDisplay()
            CHOICE = int(input("Enter choice: "))
            if CHOICE in [1, 2, 3, 4, 5]:
                if CHOICE == 1:
                    add_one_item(inventory)
                elif CHOICE == 2:
                    remove_one_item(inventory)
                elif CHOICE == 3:
                    update_inventory(inventory)
                elif CHOICE == 4:
                    search_inventory(inventory)
                elif CHOICE == 5:
                    print_inventory(inventory)
                exit_choice = ask_exit_or_continue()
                if exit_choice == 99:
                    exit()
            elif CHOICE == 99:
                exit()
        except Exception as e:
            print("Invalid choice! try again!"+str(e))
            print()

        # If the user pick an invalid choice,
        # the program will come to here and
        # then loop back.


main()

The program is called Cleancopy.py and I am trying to save the data to a TextEdit file or excel document called Inventory.

The code that is suppose to export the name and qty in the list called inventory.

How do I fix this? This is my first time trying to save this data. Thank you for your time.

1 Answers1

0

The quickest way to save and retrieve lists is to save them to a text file, then use eval to read the lists. For the inventory, update the data file each time an item is added or removed. Load the data when the inventory object if first instantiated.

Try this update:

class Inventory:
    def __init__(self):
        .....
        self.load()
        
    def remove(self, name):
        ....
        self.save()

    def add(self, name, qty):
        .....
        self.save()

    def update(self, name, update):
        .....
        self.save()

    .....
    
    def save(self):
        with open('inventory.dat','w') as f:
           f.write(str(self.item) + '\n' + str(self.qty))

    def load(self):
        from os import path
        if path.exists('inventory.dat'):
            with open('inventory.dat','r') as f:
               lns = f.readlines()
               self.item = eval(lns[0])
               self.qty = eval(lns[1])

For more data, you should use a csv file.

Mike67
  • 11,175
  • 2
  • 7
  • 15