【问题标题】:(Python) How can I let a user open a text file and then change an integer / number(Python)如何让用户打开文本文件然后更改整数/数字
【发布时间】:2015-03-05 19:29:43
【问题描述】:

我问过类似的问题,但无济于事。

我是一名新手编程学生,我只学过一些基本技术。任务的一部分是创建一个我大部分都完成的食谱程序,只有一个部分阻止我完成。

我应该允许用户调用以前创建的文本文件(我已经完成了这一点),然后应该显示该文件的内容供他们查看(我也完成了这一点) ,但是用户应该能够重新计算份量并因此更改成分的数量。因此,如果用户输入:“我想要 2 份”并且 1 份的原始数量是 100 克,那么现在应该输出 200 克。

这真的让我很沮丧,我的老师希望明天能完成这项工作。以下是我应该允许用户执行的操作。

用户应该能够检索食谱并为不同数量的人重新计算成分。

• 程序应要求用户输入人数。

• 程序应该输出:

• 配方名称

• 新的人数

• 修订后的数量以及此人数的单位。

我将在下面发布我的实际代码,以展示我到目前为止所做的事情,即允许用户查看和制作新食谱。但是缺少修改后的数量位。

如果代码杂乱无章,我深表歉意,我是新手。

到目前为止的代码:

#!/usr/bin/env python

import time

def start():

    while True:

        user_input = input("\nWhat would you like to do? " "\n 1) - Enter N to enter a new recipe. \n 2 - Enter V to view an exisiting recipe, \n 3 - Enter E - to edit a recipe to your liking. \n 4 - Or enter quit to halt the program " "\n ")

        if user_input == "N":
            print("\nOkay, it looks like you want to create a new recipe. Give me a moment..." "\n")
            time.sleep(1.5)
            new_recipe()

        elif user_input == "V":
            print("\nOkay, Let's proceed to let you view an existing recipe stored on the computer")
            time.sleep(1.5)
            exist_recipe()

        elif user_input == "E":
            print("\nOkay, it looks like you want to edit a recipe's servings. Let's proceed ")
            time.sleep(1.5)
            modify_recipe()

        elif user_input == "quit":
            return

        else:
            print("\nThat is not a valid command, please try again with the commands allowed ")


def new_recipe():
    new_recipe = input("Please enter the name of the new recipe you wish to add! ")
    recipe_data = open(new_recipe, 'w')
    ingredients = input("Enter the number of ingredients ")
    servings = input("Enter the servings required for this recipe ")

    for n in range (1,int(ingredients)+1):

        ingredient = input("Enter the name of the ingredient ")
        recipe_data.write("\nIngrendient # " +str(n)+": \n")
        print("\n")
        recipe_data.write(ingredient)
        recipe_data.write("\n")
        quantities = input("Enter the quantity needed for this ingredient ")
        print("\n")
        recipe_data.write(quantities)
        recipe_data.write("\n")
        unit = input("Please enter the unit for this quantity (i.e. g, kg) ")
        recipe_data.write(unit)
        print("\n")

    for n in range (1,int(ingredients)+1):
        steps = input("\nEnter step " + str(n)+ ": ")
        print("\n")
        recipe_data.write("\nStep " +str(n) + " is to: \n")
        recipe_data.write("\n")
        recipe_data.write(steps)
    recipe_data.close()

def exist_recipe():
    choice_exist= input("\nOkay, it looks like you want to view an existing recipe. Please enter the name of the recipe required. ")
    exist_recipe = open(choice_exist, "r+")
    print("\nThis recipe makes " + choice_exist)
    print(exist_recipe.read())
    time.sleep(1)

def modify_recipe():
    choice_exist = input("\nOkay, it looks like you want to modify a recipe. Please enter the name of this recipe ")
    exist_recipe = open(choice_exist, "r+")    
    servrequire = int(input("Please enter how many servings you would like "))


start()

编辑:

下面是一个创建文本文件(recipe)的示例及其输出(文件名为bread.txt)注意输出有点乱,一旦我能得到核心,我会解决这个问题程序工作。

创建食谱

What would you like to do? 
 1) - Enter N to enter a new recipe. 
 2 - Enter V to view an exisiting recipe, 
 3 - Enter E - to edit a recipe to your liking. 
 4 - Or enter quit to halt the program 
 N

Okay, it looks like you want to create a new recipe. Give me a moment...

Please enter the name of the new recipe you wish to add! bread.txt
Enter the number of ingredients 3
Enter the servings required for this recipe 1
Enter the name of the ingredient flour


Enter the quantity needed for this ingredient 300


Please enter the unit for this quantity (i.e. g, kg) g


Enter the name of the ingredient salt


Enter the quantity needed for this ingredient 50


Please enter the unit for this quantity (i.e. g, kg) g


Enter the name of the ingredient water


Enter the quantity needed for this ingredient 1


Please enter the unit for this quantity (i.e. g, kg) l



Enter step 1: pour all ingredients into a bowl



Enter step 2: mix together



Enter step 3: put in a bread tin and bake

查看食谱

What would you like to do? 
 1) - Enter N to enter a new recipe. 
 2 - Enter V to view an exisiting recipe, 
 3 - Enter E - to edit a recipe to your liking. 
 4 - Or enter quit to halt the program 
 V

Okay, Let's proceed to let you view an existing recipe stored on the computer

Okay, it looks like you want to view an existing recipe. Please enter the name of the recipe required. bread.txt

This recipe makes bread.txt

Ingrendient # 1: 
flour
300
g
Ingrendient # 2: 
salt
50
g
Ingrendient # 3: 
water
1
l
Step 1 is to: 

pour all ingredients into a bowl
Step 2 is to: 

mix together
Step 3 is to: 

put in a bread tin and bake

如果你输入 V,这里是输出:

这个食谱做面包.txt

Ingrendient # 1: 
flour
300
g
Ingrendient # 2: 
salt
50
g
Ingrendient # 3: 
water
1
l
Step 1 is to: 

pour all ingredients into a bowl
Step 2 is to: 

mix together
Step 3 is to: 

put in a bread tin and bake

期待您的回复。

【问题讨论】:

  • 您的问题有点含糊,因为不清楚您的问题是什么。您建议您要阅读一个文本文件,当您有一个数值时,将其相乘以增加成分的数量。我只能建议,当您从文件中读取数据时,如果您知道它是一个数字,请使用 int(somevariablename) 之类的东西将字符串转换为整数,从而能够将其用作数字。
  • 为什么要使用文本文件来存储食谱?为什么不是某种数据库?我知道数据库对新用户来说有点吓人,但是一旦你掌握了它们,从长远来看它们会拯救你。除了它们在现实生活中更相关这一事实之外。
  • @Raceyman 抱歉,我会尽力澄清。假设我想调用一个已经存在的食谱(例如 pie) 用户可以键入 pie 或 pie.txt 并显示内容供用户查看成分和数量等。所以我,用户,应该能够修改配料的量,比如说我输入我要两份,而原来的食谱有 1 份 500 克面粉,它应该输出新的数量,即 1000g 或 1kg。
  • @KronoS 我自己也想过这个,但是我们的老师坚持我们使用文本文件并且只使用python来创建这个程序。她只是教我们文件处理的基础知识以及如何打开、读取和写入文件,并告诉我们创建它。
  • 我会使用 JSON 来做这样的事情。不用担心那些讨厌的解析逻辑。

标签: python file python-3.x raspberry-pi


【解决方案1】:

您的食谱文件看起来像这样:

Ingrendient # N: 
{INGREDIENT}
{AMOUNT}
{METRIC}
...
(After N ingredients...)
Step N: 
{INSTRUCTIONS}

所以基本上你想一次阅读四行,丢弃第一行,然后将其余的分配给有用的东西。

with open(path_to_recipe) as infile:
    ingredients = []
    while True:
        try:
            sentinel = next(infile) # skip a line
            if sentinel.startswith("Step"):
                # we're past the ingredients, so
                break
            name = next(infile)
            amount = next(infile)
            metric = next(infile)
        except StopIteration:
            # you've reached the end of the file
            break
        ingredients.append({'name':name, 'amount':float(amount), 'metric':metric})
        # use a dictionary for easier access

当我们退出 with 块时,ingredients 将是一个字典列表,可以使用如下:

for ingredient in ingredients:
    scaled_volume = ingredient['amount'] * scale # double portions? etc...
    print(scaled_volume, ingredient['metric'], " ", ingredient['name'])
# # RESULT IS:
300g flour
50g salt
1l water

你应该能够利用所有这些来完成你的任务!

【讨论】:

  • 请注意,使用 itertools 的 grouper recipe 是从文件中获取多行的首选方式,但我认为这超出了您目前应该知道的范围,并且可能比这样做更难理解以这种方式手工制作。
  • 非常感谢!你真是天赐之物,我为此花费了异常多的时间,终于解决了。非常感谢!!!
  • @SpartanSK117 很高兴我能帮上忙。只要确保您了解代码中所做的事情以及如何将其应用于未来的情况!如果这意味着您无法学习该主题,我对为您做作业不感兴趣!
  • 我现在绝对明白了!我现在正在将 cmets 放入代码中,并且我还学习了一些新的使用技能。再次感谢!!
猜你喜欢
  • 1970-01-01
  • 2020-03-19
  • 2015-09-07
  • 1970-01-01
  • 2019-12-29
  • 2022-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-03
相关资源
最近更新 更多