我正在为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
答案 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()