迭代txt文件python

时间:2019-04-29 14:27:18

标签: python

我正在尝试遍历包含一堆食谱的简单.txt文件。 我想要的是让我的循环查找以-Ingredients开头的所有部分,并添加每一行成分 到清单上,移至下一组配料并添加这些配料,直到我拥有一个完整的清单,包括 文件中的所有成分。常规文件结构如下:

  • 意大利面沙拉
  • 说明: bla bla

  • 成分:

  • 成分1
  • 成分2
  • 成分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

5 个答案:

答案 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

这不完全是“将每一行附加到下一部分,然后继续进行下一个 成分部分”结构,但效果很好。

另一方面,如果没有在其他地方使用ossys,则我认为您不需要它们。

答案 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()的解释如下:

  1. 将整个文件读为文本。
  2. 从文本中提取“-Ingredients:”和“-Preperation:”之间的所有文本
  3. 创建所有成分的列表。此时,列表包含空行。
  4. 过滤掉空行。
  5. 退货。

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中。然后,您可以使用该列表执行任何操作。