我正在尝试遍历包含一堆食谱的简单.txt文件。 我想要的是让我的循环查找以-Ingredients开头的所有部分,并添加每一行成分 到清单上,移至下一组配料并添加这些配料,直到我拥有一个完整的清单,包括 文件中的所有成分。常规文件结构如下:
说明: bla bla
成分:
成分3
准备工作: bla bla bla
这是到目前为止我的代码示例:
import os
import sys
def get_ingredients_from_file():
recipe_file = open("/Filepath/", "r")
final_ingredients_list = list()
for line in recipe_file:
if line.startswith("-Ingredients"):
# append every line until next section, then move on to next
# ingredient section
答案 0 :(得分:1)
您可以使用临时列表向其添加成分,然后在遇到它们时
在Cisco 3750 i7706-cm021 10.123.12.34 ->
行中,您可以将此列表追加到更大的列表中,然后再次执行相同的操作。
^.*(?![\d\.]{12}$)
所以,如果文件看起来像
- Ingredients:
输出看起来像
def get_ingredients_from_file():
result = []
with open('file.txt') as fp:
li = []
for line in fp:
#Append the ingredients to temporary list
if line.startswith('*'):
li.append(line.replace('*','').strip())
#Get a new list and append it to result
elif line.startswith("- Ingredients"):
li = []
result.append(li)
return result
print(get_ingredients_from_file())
答案 1 :(得分:0)
怎么样:
def get_ingredients_from_file():
recipe_file = open("./extractIngredients_input.txt", 'r')
final_ingredients_list = list()
add_ingredients = list()
pick = False
for line in recipe_file:
if line.startswith("- Ingredients"):
pick = True
add_ingredients = list()
elif line.startswith("-") and pick:
pick = False
final_ingredients_list.append(add_ingredients)
elif pick and (len(line) > 1):
add_ingredients.append(line[2:-1])
if pick:
final_ingredients_list.append(add_ingredients)
return final_ingredients_list
这不完全是“将每一行附加到下一部分,然后继续进行下一个 成分部分”结构,但效果很好。
另一方面,如果没有在其他地方使用os
和sys
,则我认为您不需要它们。
答案 2 :(得分:0)
假设txt文件中的所有部分都以“-”开头,则可以创建两个String标志,并将其用作嵌套for循环中的检查,如下所示:
import os
import sys
def get_ingredients_from_file():
recipe_file = open("/Filepath/", "r")
final_ingredients_list = list()
string_flag1 = "-Ingredients"
string_flag2 = "-"
for line in recipe_file:
if line.startswith(string_flag1): #Line is ingredients
for line in recipe_file:
if not line.startswith(string_flag2): #Loop until second string flag is encountered
final_ingredients_list.append(line) #append lines to the list
else:
break
希望这会有所帮助。
答案 3 :(得分:0)
如果您讨厌ifs和else,并且假设您只有一个Ingredients部分,这是一种使用正则表达式的方法。
import re
def get_ingredients():
text = open('recipe_test.txt', 'r').read()
ingredients = re.search(r'- Ingredients:(.*?)- Preperation:', text, re.DOTALL).group(1)
ingredients = ingredients.splitlines()
ingredients = list(filter(lambda x: x, ingredients))
return ingredients
def main():
ingredients = get_ingredients()
for ingredient in ingredients:
print(ingredient)
if __name__ == '__main__':
main()
get_ingredients()的解释如下:
main()仅运行get_ingredients(),而整齐地(?)打印出配料。
答案 4 :(得分:-1)
def get_ingredients_from_file():
recipe_file = open("/Filepath/", "r")
recipe_text = recipe_file.readlines()
recipe_list = []
i = 1
for line in recipe_text:
if line.startswith('- Ingredients'):
while recipe_text[recipe_text.index(line) + i].startswith('* '):
recipe_list.append(recipe_text[recipe_text.index(line) + i])
i += 1
我仍然是新手,但是它将查找以“-Ingredients”开头的行,然后检查以“ *”开头的行是否存在,如果是,则将其添加到您的recipe_list中。然后,您可以使用该列表执行任何操作。