2017-04-18 14 views
0

私は現在、インベントリシステムを作成しようとしています。私はそれが私のために辞書を保存するように思えたので、私はpickleを使うと思った。唯一の問題は、今はリストを参照するたびに、リストに別のアイテムを追加するために戻ってきて、そこにあるものを削除します。Python内でのピクルの問題

import pickle 
#creates a dictonary 
Inventory = {} 
product_add = "" 
Key = "Key \n+ changes stock, \ni or I shows inventory" 

print(Key) 

def main(): 
    choice = input("What do you want to do today? ") 

    if choice == "+": 
     Change() 
    else: 
     inv() 

def Change(): 
    product = input("What product do you want to add/change? ") 
    value = input("How much of it? ") 

    Inventory.update({product: value})#places into dictonary 
    pickle.dump(Inventory, open("save.p", "wb")) 

    continu = input("Would you like to enter any more products into inventory? y/n ") 

    if continu == "y" or continu == "Y":#allows them to either continue to update inventory or move on 
     Change() 

    else: 
     inv() 

def inv():#prints inventory 
    print() 
    print() 
    print() 
    Inventory = pickle.load(open("save.p", "rb")) 
    for key,val in sorted(Inventory.items()):#prints the dictonary in a column alphabetized 
     print(key, "=>", val) 
    print() 
    print() 
    print() 
    print(Key) 

    Pass = input("What would you like to do? ") 

    if Pass == "+":#keeps the program going, and allows them to change the dictonary later 
     Change() 

    else: 
     main() 

main() 
+0

あなたが期待している動作と観察しているさまざまな動作を正確に記述できますか? (私はちょっと遊んだし、テストしたものはうまくいった) –

+1

辞書に一意のキーを追加していることを確認してください。 Python辞書の項目はキーで参照されます。アイテムは基本的にキーと値のペアです。キーは辞書内で常に一意です。既にそこにあるキーを追加しようとすると、Pythonは文句を言わないでしょう。プログラムの制限は、(まだ)一連の値(つまり、特定の製品の複数のインスタンス)に対応できないことです。 –

+0

また、Pythonでは関数名と変数名を小文字で記述したいと思うでしょう。 –

答えて

3

プログラムが起動するたび、あなたはあなたが以前に保存した在庫をロードする空Inventory

Inventory = {} 

を作成します。すでに誰も存在しない場合にのみ、空の新しいものを作成することができます。

あなたはそのようにそれを行うことができます:

try: 
    Inventory = pickle.load(open("save.p", "rb")) 
except FileNotFoundError: 
    Inventory = {} 

あなたのコード内の他のいくつかの問題があります。

1つは関数がお互いを再帰的に呼び出していることです.1000回の呼び出し後にプログラムがクラッシュし、ロジックが複雑になります。
メニューを管理するループをmain()に入れて、invかchange関数を呼び出す必要があります。

+0

私はまだプログラミングにかなり新しいです。私はあなたが何を意味するのか混乱しています。 – Linkstus