将pickle数组拆分成单独的变量?

时间:2014-03-17 17:07:01

标签: python arrays pickle

我正在尝试使用Python创建一个程序,允许用户输入食谱需要服务的人数,并根据旧服务号重新计算原始食谱的数量。

例如,最终的计算将是:

(ingredient quantity / old serve number) * new serve number

第一段代码用于将配方所服务的人员,成分和成分详细信息写入腌制文件。成分细节循环并存储在阵列中,以便可以存储多种成分。

 serve = int (input ("Enter number of people: ")) #Prompts user for number of people the recipe will serve

 recipedetails=[]#starts array

 for i in range (ing_number): *#Loops 3 intented inputs by ing_number amount of times*
        name = input ("Enter ingredient name: ") *#Ingredient name variable*
        amount = int (input ("Enter quantity of ingredient ")) *#Quantity variable*
        unit =  input ("Enter unit of ingredient: ") *#Unit variable*

        recipedetails.append ((name, amount, unit)) *#closes array with variables added*

        recipeinfo = serve , recipedetails *# adds serve and recipedetails to recipe info variable*

        recipe = open(rec_name+".dat", "wb") *#Creates .dat file with recipe name as file  name.*
        pickle.dump(recipeinfo, recipe) *#Adds this recipeinfo to .dat file*

这一切都正常,食谱所服务的人和成分都存储在酸洗文件中。但是,问题在于从阵列中回忆信息。需要从数组中调用可变数量,以乘以新的人数。

 import os 
 textfiles = [f for f in os.listdir(os.curdir) if f.endswith (".dat") ] *#imports* 
 print (textfiles)
 rec_name = input ("Enter recipe name: ") *#Prompts user for recipe name.*
 rd = open (rec_name+ ".dat", "rb") *#Opens the file the user selected*
 recipeinfo = pickle.load(rd) *#Gives loaded file a variable so it can be displayed*

 print(recipeinfo) *# Prints recalled information*

到目前为止的代码工作正常。使用这个我可以从保存的数组中查看recipeinfo。但是,我不知道如何将数组拆分为原始变量。

  • name - 金额前显示的成分名称
  • amount - 需要按人数划分并乘以新金额
  • unit - 显示金额
  • serve - 需要将原始值除以获得新值。

如何将这个pickle文件拆分成这些变量?

3 个答案:

答案 0 :(得分:1)

您的结构似乎是:

recipeinfo == (serve, [(name, amount, unit), (name, amount, unit), ...])

所以你可以使用:

recipeinfo变回这些变量
serve, recipedetails = recipeinfo
for name, amount, unit in recipedetails:

但是,如果您只从recipedetails获取列表pickle.load,则可以执行以下操作:

for name, amount, unit in recipeinfo:

答案 1 :(得分:1)

这个问题并不特别与酸洗有关。

考虑:

def return_a_tuple(a, b, c):
    return (a, (b, c))

x = return_a_tuple(1, 2, 3)

如何从a中提取bcx

正如jonrsharpe所说,答案是做类似的事情:

(a, (b, c)) = x

另外,我怀疑不是

recipedetails.append((name, amount, unit))
recipeinfo = serve , recipedetails

你的意思是

recipedetail = (name, amount, unit)
recipedetails.append(recipedetail)
recipeinfo = serve, repcipedetail

您的原始代码正在创建成对的serve,其中包含您目前所见的每个食谱详细信息的列表,而不仅仅是您刚读过的那个。

或者,您可以考虑使用namedtuple

from collections import namedtuple

RecipeDetail = namedtuple('RecipeDetail', ['name', 'amount', 'unit'])
RecipeInfo = namedtuple('RecipeInfo', ['serve', 'recipe_detail'])

然后您可以执行类似

的操作
recipedetail = RecipeDetail(name, amount, unit)
recipedetails.append(recipedetail)
recipeinfo = RecipeInfo(serve, recipedetail)

现在您可以通过执行以下操作来访问子字段:

recipedetail.name
recipeinfo.recipe_detail.amount

答案 2 :(得分:0)

您想要提取包含名称,金额和单位价值的元组列表

import sys
ingredients_list = ''
for item in recipeinfo:
    if type(item) == list:
        ingredients_list = item
        continue

确认您找到了一个列表:

if ingredients_list == '':
    print("I never found a list!")
    sys.exit(1)

for name, amount, unit in ingredients_list:
     print("{0}: {1} {2}").format(name, amount, unit)
    . . .

并使用这些值进行计算,打印说明等。