Python:食谱计划

时间:2013-04-22 11:28:35

标签: python recipe

我正在为GCSE Computing做一个Recipe项目。它将配方存储在.txt文档中,然后在请求时打开并显示要读取的信息。

此时,它将配方存储在.txt文件的顶部,而成分存储在底部。它运行thorugh heading1为配方并分开它呈现。然后它应该通过heading2并查看每个列,成分,重量和测量。然后使用for循环,将浏览列表并显示成分以及各自的重量和测量值。

代码如下:

#-------------------------------------------------------------------------------
# Name:        Recipe Holder
# Purpose:      Hold recipes
#
# Author:      Ashley Collinge
#
# Created:     25/02/2013
# Copyright:   (c) Ashley Collinge 2013
#-------------------------------------------------------------------------------
def menu():
    print "Recipe Holder"
    print "Use the numbers to navigate the menu."
    print ""
    print ""
    print "1) View Recipes"
    print "2) Add Recipes"
    print "3) Delete Recipe"
    print ""
    choice_completed = False
    while choice_completed == False:
        choice = raw_input("")
        if choice == "1":
            choice_completed = True
            view_recipe()
        elif choice == "2":
            choice_completed = True
            add_recipe()
        elif choice == "3":
            choice_completed = True
            delete_recipe()
        else:
            choice_completed = False

def view_recipe():
    print ""
    print ""
    mypath = "/recipe"
    from os import listdir
    from os.path import isfile, join
    onlyfiles = [ f for f in listdir("H:/Recipes/recipes") if isfile(join("H:/Recipes/recipes",f)) ]
    a = -1
    for i in onlyfiles:
        a = a +1
        print a, i
    print ""
    print "Type in the number of the recipe you would like to view, below and press enter."
    print ""
    choice = input("")
    import os, sys
    print onlyfiles[choice]
    something = str(onlyfiles[choice])
    directory =  "recipes" + "\\" + something
    from itertools import takewhile, imap
    with open(directory) as f:
        items = list(takewhile("heading1".__ne__, imap(str.rstrip, f)))
        print "Recipe for " + directory
        for h in range(len(items)): #following three lines to take the list of recipe and split it by line in to instructions then display
            print str(h)+". "+str(items[h])
    def getColumn(title,file):
        result = []
        global result
        with open(file) as f:
            headers = f.readline().split(',')
            index = headers.index(title)
            for l in f.readlines():
                result.append(l.rstrip().split(',')[index])
            return result

    ingredients = (getColumn("ingredients",directory))
    weight = (getColumn("weight",directory))
    measurement = (getColumn("measurement",directory))
    print directory
    print "Ingredients"
    for i in range(len(ingredients)):
        print ingredients[i]+" "+weight[i]+" "+measurement[i]
    input("")

def delete_recipe():
    print "Delete Recipe"
    print "Type in the number of the recipe you would like to delete, below and press enter."
    mypath = "/recipe"
    from os import listdir
    from os.path import isfile, join
    onlyfiles = [ f for f in listdir("H:/Recipes/recipes") if isfile(join("H:/Recipes/recipes",f)) ]
    a = -1
    for i in onlyfiles:
        a = a +1
        print a, i
    choice = input("")
    import os, sys
    print onlyfiles[choice]
    something = str(onlyfiles[choice])
    directory =  "recipes" + "\\" + something
    os.remove(directory)

menu()

文本文件如下:

Recipe As now
Put sugar in bowl
heading1
ingredients,weight,measurement,
Sugar,100,grams
heading2

我得到以下错误:

raspberry_pie - Copy (8).txt
Recipe for recipes\raspberry_pie - Copy (8).txt
0. Recipe As now
1. fhgje
2. fe
Traceback (most recent call last):
  File "H:\Recipes\Recipe Program.py", line 96, in <module>
    menu()
  File "H:\Recipes\Recipe Program.py", line 24, in menu
    view_recipe()
  File "H:\Recipes\Recipe Program.py", line 69, in view_recipe
    ingredients = (getColumn("ingredients",directory))
  File "H:\Recipes\Recipe Program.py", line 65, in getColumn
    index = headers.index(title)
ValueError: 'ingredients' is not in list

1 个答案:

答案 0 :(得分:0)

这是上面程序的重写版本。唯一不起作用的是添加食谱。如果您需要进一步的帮助,请对此答案发表评论。您需要在此程序旁边创建一个名为 recipes 的子目录(或者您设置SUBDIR变量名称的任何内容)。要进行测试,请确保在运行之前将raspberry_pie.txt文件放在该文件夹中。

#-------------------------------------------------------------------------------
# Name:         Recipe Holder
# Purpose:      Hold recipes
#
# Author:       Ashley Collinge & Stephen Chappell
#
# Created:      11 July 2013
# Copyright:    (c) Ashley Collinge 2013
#-------------------------------------------------------------------------------

from collections import OrderedDict
from itertools import takewhile, zip_longest
from os import listdir, remove
from os.path import join, isfile, splitext, basename

#-------------------------------------------------------------------------------

SUBDIR = 'recipes'

def main():
    print('Recipe Holder')
    print('Use the numbers to navigate the menu.')
    options = {'1': view_recipe,
               '2': add_recipe,
               '3': delete_recipe}
    for key in sorted(options, key=int):
        print('{}) {}'.format(key, get_title(options[key].__name__)))
    while True:
        choice = input('> ')
        if choice in options:
            options[choice]()
            break

#-------------------------------------------------------------------------------

def view_recipe():
    path = get_file('Type in the number of the recipe you '
                    'would like to view and press enter.')
    print('Reciple for', get_name(path))
    with open(path) as file:
        lines = filter(None, map(str.strip, file))
        for step in enumerate(takewhile('heading1'.__ne__, lines), 1):
            print('{}. {}'.format(*step))
        columns = OrderedDict((name.strip(), [])
                              for name in next(lines).split(','))
        max_split = len(columns) - 1
        for info in takewhile('heading2'.__ne__, lines):
            fields = tuple(map(str.strip, info.split(',', max_split)))
            for key, value in zip_longest(columns, fields, fillvalue=''):
                columns[key].append(value)
    ingredients = columns['ingredients']
    weights = columns['weight']
    measurements = columns['measurement']
    assert len(ingredients) == len(weights) == len(measurements)
    print('Ingredients')
    for specification in zip(ingredients, weights, measurements):
        print(*specification)

def add_recipe():
    raise NotImplementedError()

def delete_recipe():
    path = get_file('Type in the number of the recipe you '
                    'would like to delete and press enter.')
    remove(path)

#-------------------------------------------------------------------------------

def get_file(prompt):
    files = tuple(name for name in
                  (join(SUBDIR, name) for name in listdir(SUBDIR))
                  if isfile(name))
    for index, path in enumerate(files, 1):
        print('{}) {}'.format(index, get_name(path)))
    print('Type in the number of the recipe you '
          'would like to view and press enter.')
    return files[int(input('> ')) - 1]

def get_name(path):
    return get_title(splitext(basename(path))[0])

def get_title(name):
    return name.replace('_', ' ').title()

#-------------------------------------------------------------------------------

if __name__ == '__main__':
    main()