Ashley Collinge
Ashley Collinge

Reputation: 15

Python: Recipe Program

I'm doing a Recipe program project for GCSE Computing. It stores recipes in .txt documents and then when requested it will open and present the information for those to read.

At this moment in time, it stores the recipe at the top of the .txt file and the ingredients at the bottom. It runs thorugh heading1 for the recipe and splits it up for presenting. Then it should go through heading2 and look through each column, ingredients, weight and measurement. Then using a for loop, will go through the lists and present the ingredients together with their respective weight and measurement.

Code is as below:

#-------------------------------------------------------------------------------
# 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()

Text file is as below:

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

I get the following as an error:

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

Upvotes: 1

Views: 17398

Answers (1)

Noctis Skytower
Noctis Skytower

Reputation: 22031

This is a rewritten version of your program up above. The only thing that does not work is adding recipes. If you need further help, please post a comment on this answer to that effect. You will need to create a subdirectory alongside this program called recipes (or whatever you set the SUBDIR variable name to be). To test, make sure you put your raspberry_pie.txt file in that folder before running.

#-------------------------------------------------------------------------------
# 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()

Upvotes: 1

Related Questions