如何使用同一文件中其他位置包含的数据替换文件中的行?

2024-04-30 03:46:23 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有一个叫做“食物”的文件,上面列出了一些食物的名称和价格。其中有些是原料,有些是用不同数量的原料制成的——例如,我可能会手动将鸡蛋的价格列为1,然后发现煎蛋饼的默认价格是10,但是后来发现一个煎蛋饼只需要5个鸡蛋,所以我需要程序来读取鸡蛋的价格,找到包含煎蛋卷的行,并将其替换为“Omelete:”+str(5*eggs)。我可能还需要添加额外的食材/食物,例如一堆由5个煎蛋组成的煎蛋。其基本目标是使人们能够编辑鸡蛋的价值,并更新煎蛋卷和肉馅卷的价值。我只是通过创建文件中包含的行的列表来启动代码。你知道吗

with open("Food.txt") as g:
    foodlist=g.readlines()

文件的食品.txt'将采用以下格式:

eggs: 5
omelette: 20
pileofomelettes: 120

等等。。。 在代码运行之后

eggs: 5
omelette: 25
pileofomelettes: 125

我会手动编写关系代码,因为它们不太可能发生变化(即使它们发生了变化,我也很容易进入并更改系数)

python以列表格式读取

'['鸡蛋2\n'、'面粉1\n'、'黄油1\n'、'糖3\n'、'杏仁5\n'、'樱桃8\n']

我已经搜索了搜索/替换算法,可以搜索一个特定的短语并用另一个特定的短语替换它,但我不知道如果行可能发生更改,我将如何应用它(如果用户希望更新与它相关的所有值,可以更改原始成分值)。我能想到的一个解决方案是将它们转换成字典格式,将它们都列为一个字符串整数值对,这样我就可以根据存储在其他字符串整数值对中的整数值替换整数值对的整数部分,但是,由于缺乏经验,我不知道如何转换列表(或原始文件本身,更好的)编入字典。你知道吗

任何关于如何执行本计划步骤的建议都将不胜感激:)

编辑-在程序的实际应用中,在最终文件中列出项目的顺序无关紧要,因此如果我在一个位置列出所有的原材料,在另一个位置列出所有的合成项目(如果需要添加更多的原材料,则在它们之间留有很大的空间),那么我可以重新编写整个程序的后半部分只要原料的行位置保持不变,就可以按任意顺序归档。你知道吗


Tags: 文件程序编辑列表格式价格整数手动
3条回答

您的程序如何知道每个项目的组件?我建议你保存两个文件:一个是原子物品(鸡蛋)的成本,另一个是食谱(煎蛋饼<;=5个鸡蛋)。你知道吗

读取两个文件。存储原子成本,记住你有多少这样的项目,原子计数。从recipes文件扩展此表,每次一行。如果你正在阅读的食谱完全由已知成本的项目组成,那么计算成本并将该项目添加到“已知”列表中。否则,将配方附加到“稍后”列表并继续。你知道吗

当您到达两个输入文件的末尾时,您将有一个已知成本的列表,以及一些其他依赖于配方文件后面项目的配方。现在循环这个“未知”列表,直到(a)它是空的;(b)你没有任何已知的成分。如果是第(b)种情况,您的输入有问题:要么是没有定义的成分,要么是循环依赖。打印剩余配方列表并调试输入文件。你知道吗

在案例(a)中,您现在可以打印食品.txt列表。浏览你的“已知”清单,一次写出一个项目或食谱。当你进入项目[原子计数]时,写出第二个文件,一个新的配方列表。这是你以前的食谱清单,但从上到下的顺序很有用。在未来,你不会有任何“未知”的食谱后,第一次通过。你知道吗

为了将来的改变。。。不用麻烦了。你只有173个条目,而且这个列表听起来不太可能超过500条。更改或添加项目时,只需手动编辑文件并重新运行程序。这将比您尝试编写的字符串替换算法更快。你知道吗

总之,我建议您只做初始计算问题,这比添加字符串更新要简单得多。不要做增量更新;从头开始重做整个列表。对于这样一个小的列表,计算机将比您编写和调试额外代码的速度更快。你知道吗

我仍然不确定你问的是什么,但这是我想到的。。。你知道吗

from collections import OrderedDict

food_map = {'omelette': {'eggs': 5, 'price': None}, 'pileofomelettes': {'eggs': 25, 'price': None}, 'eggs': {'price': 5}}

with open('food.txt', 'rb') as f:
    data = f.read().splitlines()

data = OrderedDict([(x[0], int(x[1])) for x in [x.split(': ') for x in data]])

for key, val in data.items():
    if key == 'eggs':
        continue
    food_rel = food_map.get(key, {})
    val = food_rel.get('eggs', 1) * food_map.get('eggs', {}).get('price', 1)
    data[key] = val

with open('out.txt', 'wb') as f:
    data = '\n'.join(['{0}: {1}'.format(key, val) for key, val in data.items()])
    f.write(data)

好吧,我建议你做一个关系文本文件,你可以解析它,以防你认为关系以后会改变,或者只是为了让你的代码更容易阅读和修改。然后可以对其进行解析,以找到原料和配合物之间所需的关系。顺其自然吧”关系.txt,类型为:

omelette: 5 x eggs + 1 x onions
pileofomelettes: 6 x omelette

在这里,您可以放置任意数量的成分类型:

complex: number1 x ingredient1 + number2 x ingredient2 + ...

等等。 还有你的食品.txt包含所有成分和复合物的价格:

eggs: 2
onions: 1
omelette: 11.0
pileofomelettes: 60

现在我们可以看到pileofomlettes的值故意没有正确映射到这里。因此,我们将运行下面的代码,您也可以更改数字并查看结果。你知道吗

#!/usr/bin/python
''' This program takes in a relations file and a food text files as inputs
and can be used to update the food text file based on changes in either of these'''

relations = {}
foodDict = {}

# Mapping ingredients to each other in the relations dictionary
with open("relations.txt") as r:
    relationlist=r.read().splitlines()
    for relation in relationlist:
        item, equatedTo = relation.split(': ')
        ingredientsAndCoefficients = equatedTo.split(' + ')
        listIngredients = []
        for ingredient in ingredientsAndCoefficients:
            coefficient, item2 = ingredient.split(' x ')
            # A list of sets of amount and type of ingredient
            listIngredients.append((float(coefficient),item2))
        relations.update({item:listIngredients})


# Creating a food dictionary with values from food.txt and mapping to the relations dictionary
with open("food.txt") as g:
    foodlist=g.read().splitlines()
    for item in foodlist:
        food,value = item.split(': ')
        foodDict.update({food:value})
    for food in relations.keys():
        # (Raw) Ingredients with no left hand side value in relations.txt will not change here.
        value = 0.
        for item2 in range(len(relations[food])):
            # Calculating new value for complex here.
            value += relations[food][item2][0]* float(foodDict[relations[food][item2][1]])
        foodDict.update({food: value })

# Altering the food.txt with the new dictionary values 
with open("food.txt",'w') as g:
    for key in sorted(foodDict.keys()):
        g.write(key + ': ' + str (foodDict[key])+ '\n')
        print key + ': ' + str(foodDict[key])

结果是:

eggs: 2
onions: 1
omelette: 11.0
pileofomelettes: 66.0

你可以把鸡蛋的价格改为5英镑食品.txt文件,以及

eggs: 5
onions: 1
omelette: 26.0
pileofomelettes: 156.0

相关问题 更多 >