我正在尝试以某种格式打印文本文件中的每一行文本,但它仅打印最后一行而不是所有行。 我使用的文本文件有4行,但根据用户的不同,它可能会更少或更多。
我的代码:
def loadrecipefile (recipe_file):
infile=open(recipe_file)
Linelist=infile.readlines()
global cookbook
for line in Linelist:
wordList=line.split()
r1={'apple':int(wordList[1]),'beets':int(wordList[2]),'carrots':int(wordList[3])}
cookbook={wordList[0]:r1}
def printrecipes():
for name,ingred in cookbook.items():
print(name + " " + str(ingred['apple']) + " " + str(ingred['beets']) + " " + str(ingred['carrots']))
因此输入为(以我为例):
loadrecipefile("recipe_file.txt")
printrecipes()
然后它将打印文本文件的每一行,我希望它看起来像这样:
Recipe1 1 4 3
Recipe2 0 2 4
Recipe3 3 0 1
Recipe4 2 1 0
但我只得到最后一行:Recipe4 2 1 0
我不确定如何执行此操作,因为loadrecipefile似乎可以正常工作,但printrecipes没有打印我想要的内容
答案 0 :(得分:1)
您将在每个循环中覆盖cookbook
变量的内容:
cookbook={wordList[0]:r1}
这将执行N次,每次都会创建一个新的带有一个键/值的字典。
您应该在每个循环中将其添加到现有字典中:
cookbook = {}
for ...:
cookbook[wordList[0]] = r1
现在,您没有要求的部分,但是您应该修复它,因为它看起来很糟糕:不要使用全局变量。什么时候?如果您从不使用它们,那不会错。
不是将结果存储在全局变量中,而是从函数返回结果:
def loadrecipefile(recipe_file):
...
return cookbook
然后,在另一个函数中,获取结果:
def printrecipes(recipefile):
cookbook = loadrecipefile(recipefile)
for name, ingred in cookbook.items():
...
或执行以下操作:
def printrecipes(cookbook):
for name, ingred in cookbook.items():
...
然后:
cookbook = loadrecipefile(recipe_file)
printrecipes(cookbook)