1

我正在为 GCSE 计算做一个食谱项目。它将食谱存储在 .txt 文档中,然后在请求时打开并显示信息供人们阅读。

此时,它将配方存储在 .txt 文件的顶部,将配料存储在底部。它通过标题 1 运行配方并将其拆分以进行展示。然后它应该通过标题 2 并查看每一列、成分、重量和尺寸。然后使用 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
4

1 回答 1

1

这是上面程序的重写版本。唯一不起作用的是添加食谱。如果您需要进一步的帮助,请对此答案发表评论。您将需要在该程序旁边创建一个名为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()
于 2013-07-11T15:03:59.490 回答