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][“计数”])
水果()
水果()
鉴于您没有更正问题中的代码,以下是错误之处:
open
中指定“appending”作为模式。
当您打算读取文件时,此选项不可用;改用
r
用于读取,可能rb
用于读取二进制文件fruit=…
),因为这标志着从第3行开始退出上下文管理器(with…
是上下文管理器)。这将在您读取完文件后再次关闭该文件。不要跟在台词后面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?请求