Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 字典赢了';t在重新启动后存储该值_Python_Dictionary_Pickle - Fatal编程技术网

Python 字典赢了';t在重新启动后存储该值

Python 字典赢了';t在重新启动后存储该值,python,dictionary,pickle,Python,Dictionary,Pickle,这是我的密码。此代码用于管理商店中的水果库存。所以你输入水果的名字和数量。如果水果没有在字典中注册,它会将水果及其值添加到字典中。如果水果被注册,它会检查其值是否大于字典中的原始值。如果它更大,它将替换金额,但如果键入的金额小于原始金额,它将不起任何作用 我使用下面的代码检查水果的平均值。所以它计算了我买了多少水果,并将其累积起来。所以稍后,我可以用它来计算平均值,用这个数除以我累计的次数 items[fruit_t]["av"]+=(fruit_n) 这是一个问题。当我尝试向字典添加内容时,

这是我的密码。此代码用于管理商店中的水果库存。所以你输入水果的名字和数量。如果水果没有在字典中注册,它会将水果及其值添加到字典中。如果水果被注册,它会检查其值是否大于字典中的原始值。如果它更大,它将替换金额,但如果键入的金额小于原始金额,它将不起任何作用

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

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()
导入pickle
定义水果():
以开放式('fruits.pickle','a')作为f:
尝试:
项目=酸洗负荷(f)
除值错误外:
苹果:{av:10,“count:10}”,香蕉:{av:14,“count:14}”,橘子:{av:23,“count:23}”,西瓜:{av:54,“count:54}
水果=输入(“请输入水果名称:”)
水果n=int(输入(“请输入水果的数量:”)
如果项目中没有水果:
物品[水果][“av”]+=(水果)
如果项目[水果][“计数”]<水果:
物品[水果][“计数”]=水果
其他:
物品[水果]={“av”:水果n,“计数”:水果n}
开放式('fruits.pickle','wb')作为f:
pickle.dump(项目,f)
对于k in项目:
打印(“{}每月{}”。格式(k,项目[k][“av”]))
打印(“{}总计{}”。格式(k,项[k][“计数”]))
水果()
水果()
编辑和工作代码

    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()
导入pickle
定义水果():
开放式('fruits.pickle','rb')作为f:
尝试:
项目=酸洗负荷(f)
除值错误外:
项目={}
水果=输入(“请输入水果名称:”)
水果n=int(输入(“请输入水果的数量:”)
如果项目中没有水果:
项目[水果][“总计”]+=(水果)
如果项目[水果][“计数”]<水果:
物品[水果][“计数”]=水果
其他:
项目[水果]={“总计”:水果,计数:水果}
开放式('fruits.pickle','wb')作为f:
pickle.dump(项目,f)
对于k in项目:
打印(“{}每月{}”。格式(k,项目[k][“总计”]))
打印(项目[k][“计数”])
水果()
水果()

鉴于您没有更正问题中的代码,以下是错误之处:

  • 您已在第3行的
    open
    中指定“appending”作为模式。 当您打算读取文件时,此选项不可用;改用
    r
    用于读取,可能
    rb
    用于读取二进制文件
  • 删除第8行(
    fruit=…
    ),因为这标志着从第3行开始退出上下文管理器(
    with…
    是上下文管理器)。这将在您读取完文件后再次关闭该文件。不要跟在台词后面
  • 您不需要跟踪每次“购买”;你可以依靠1)购买总额和2)购买数量。那么计算平均值是很容易的。因此,你可以把字典一分为二
  • 在第12行,我无法理解你的逻辑,它与你在问题中所写的内容相矛盾
  • 代码示例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
    

    看看如果你买的水果还没有出现在柜台上会发生什么(即set
    fr='mandarn'
    )。

    我将用一种完全不同的方法回答你的问题:

    pickle
    将不会加载您的pickle文件,因为您正在第3行以“追加”模式打开文件。 您没有注意到错误,因为您已将加载包含在
    try
    -语句中。相反,捕获异常并从默认值加载


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

    1)检查collections模块中的Counter类()。2) 你的凹痕似乎太大了。现在,您在不破坏条件的情况下递归调用
    fruit()
    ,并在上下文管理器中重新打开
    fruits.pickle
    。@MrGumble如果您能提供帮助,改进此代码,是否可能?因此这在技术上是实现我尝试的目标的更好的方法?当我尝试此代码时,这不会添加上一个值。因此,它不存储任何内容。您必须详细说明“这不会增加以前的值”的含义。在哪种情况下?从技术上讲,更好的方法取决于您的总体目标是什么。你为什么要修改字典?因为我想要的是保存在pickle文件中的数据,而不是代码。我本来打算用csv做这个,但是有人告诉我用pickle做这个,所以我用pickle做这个。哦,现在我改变了它。现在,我只需要找出如何用AV计算平均值来计算平均值,只需跟踪
    count
    的运行总和以及“购买”某物的次数。然后,平均值是总和除以购买数量。为了永久存储,可以使用pickle,但由于pickle协议可能会更改,它是次优解决方案。而是依靠基于文本的文件长期存储结果。是否可以使用csv?请求