bugfix> python > 投稿

動作するインベントリプログラムがあります。在庫と呼ばれるリストに保持されているデータ(アイテム名と数量)を保存しようとしています。そのため、次回プログラムを起動して後日編集するときに再利用できます。

私の在庫プログラムコード:

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()

プログラムはCleancopy.pyと呼ばれ、データをTextEditファイルまたはInventoryと呼ばれるExcelドキュメントに保存しようとしています。

在庫と呼ばれるリストの名前と数量をエクスポートすることを想定しているコード。

これを修正するにはどうすればよいですか?このデータを保存しようとするのはこれが初めてです。お時間をいただきありがとうございます。

回答 1 件
  • リストを保存および取得する最も簡単な方法は、リストをテキストファイルに保存してから、 eval リストを読む。インベントリの場合、アイテムが追加または削除されるたびにデータファイルを更新します。最初にインスタンス化された場合、インベントリオブジェクトのときにデータをロードします。

    このアップデートをお試しください:

    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])
    
    

    詳細なデータについては、csvファイルを使用する必要があります。

あなたの答え