字典将不会在重新启动后存储该值

时间:2015-02-04 09:02:59

标签: python dictionary pickle

这是我的代码。此代码用于管理商店中的水果库存。所以你输入水果的名称和它的数量。如果水果没有在字典中注册,它会将水果和它的价值添加到字典中。如果水果已注册,它将检查其值是否大于字典中的原始值。如果它更大,它将取代金额,但如果输入的金额小于原始金额,它就不会做任何事情。

我使用下面的代码检查水果的平均值。所以它计算了我买了多少水果并积累了它。所以,稍后,我可以用它来找出平均数除以我累积它的次数。

items[fruit_t]["av"]+=(fruit_n)

这是个问题。当我尝试将内容添加到字典中时,它会首次打印,但是当我继续添加另一种水果时,之前添加的水果会消失。我不知道什么是错的。另外,我想使用.append而不是+ =,如上所示,但是当我尝试这样做时,会出现错误。我想使用append,因为稍后,我可以使用len()来计算av中有多少个数字 ,总结av并除以av。的len()值

    import pickle
    def fruit():
        with open('fruits.pickle', 'a') as f:
            try:
                items = pickle.load(f)
            except ValueError:
                items = {"Apple":{"av":10,"count":10},"Banana":{"av":14,"count":14},"Orange":{"av":23,"count":23},"Watermelon":{"av":54,"count":54}}
            fruit_t = input("Please type in the name of the fruit: ")
            fruit_n = int(input("Please type in the amount of the fruit: "))
            if fruit_t in items:
                items[fruit_t]["av"]+=(fruit_n)
                if items[fruit_t]["count"] < fruit_n:
                    items[fruit_t]["count"] = fruit_n
            else: 
                items[fruit_t] = {"av":fruit_n,"count":fruit_n}
            with open('fruits.pickle', 'wb') as f:
                pickle.dump(items, f)
            for k in items:
                print("{} monthly  {}".format(k,items[k]["av"]))
                print("{} total {}".format(k,items[k]["count"]))
            fruit()

    fruit()

编辑并正常工作的代码。

    import pickle
def fruit():
    with open('fruits.pickle', 'rb') as f:
        try:
            items = pickle.load(f)
        except ValueError:
            items = {}
        fruit_t = input("Please type in the name of the fruit: ")
        fruit_n = int(input("Please type in the amount of the fruit: "))
        if fruit_t in items:
            items[fruit_t]["total"]+=(fruit_n)
            if items[fruit_t]["count"] < fruit_n:
                items[fruit_t]["count"] = fruit_n
        else: 
            items[fruit_t] = {"total":fruit_n,"count":fruit_n}
        with open('fruits.pickle', 'wb') as f:
            pickle.dump(items, f)
        for k in items:
            print("{} monthly  {}".format(k,items[k]["total"]))
            print(items[k]["count"])
        fruit()

fruit()

2 个答案:

答案 0 :(得分:1)

我会用一种截然不同的方法回答你的问题:

pickle不会加载您的pickle文件,因为您要在第3行附加&#39; -mode中打开该文件。 您没有注意到错误,因为您已将加载括在try语句中。相反,会捕获异常并从默认情况下加载items

解决方案:将第3行open中的模式更改为rb

答案 1 :(得分:0)

鉴于您没有更正问题中的代码,这就是错误:

  1. 您已指定&#39;追加&#39;作为第3行open中的模式。 当您打算读取文件时,这没有用;改为使用 r用于阅读,也许rb用于阅读二进制文件。
  2. Dedent第8行(fruit_t = ...)因为这标志着从第3行开始的上下文管理器的退出(with ...是一个上下文管理器)。这将在您阅读完之后再次关闭文件。 Dedent紧随其后。
  3. 您无需跟踪每个&#34;购买&#34 ;;你可以依赖1)购买总和和2)购买数量。那么计算平均值非常容易。因此,您可以将字典拆分为两个。
  4. 第12行,你的逻辑躲过了我,这与你在问题中所写的内容相矛盾。
  5. 代码示例1

    from collections import Counter
    
    fruits = {'apple':0, 'banana':0}
    purchases = Counter(fruits)
    fruits = Counter(fruits)
    ## on purchase
    fr = 'apple'
    buy = 4
    fruits[fr] += 4
    purchases[fr] += 1
    

    如果您购买的是尚未出现在柜台中的水果(即设置fr = 'mandarin'),会发生什么。