Reputation: 15
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
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