Home > other >  How do I print lines from a file in python after and before a match?
How do I print lines from a file in python after and before a match?

Time:11-26

I would like to print some specific lines from a file, only those lines that come after a certain word appears on a line ('Ingredients:') and before another word appears ('Instructions:'). The file is a list of recipes and I want to be able to print out only the ingredients.

example of the text:

RECIPE : CACIO E PEPE #PASTA
Ingredients:
spaghetti: 200-g
butter: 25-gr
black pepper: as needed
pecorino: 50-gr
Instructions:

I tried this way and many others but nothing seems to work:

def find_line_after(target):
    with open('recipes.txt', 'r') as f:
        line = f.readline().strip()
        while line:
            if line == target:
                line = f.readline().strip()
                return f.readline()
            

CodePudding user response:

def get_all_ingredients():
    flag = False
    with open('recipes.txt', 'r') as f:
        for line in f:
            if 'Instructions' in line:
                flag = False

            if flag:
                print(line.rstrip())

            if 'Ingredients' in line:
                flag = True


get_all_ingredients()

Tested input:

RECIPE : CACIO E PEPE #PASTA
Ingredients:
spaghetti: 200-g
butter: 25-gr
black pepper: as needed
pecorino: 50-gr
Instructions:
asd
RECIPE : CACIO E PEPE #PASTA
Ingredients:
salt: 200-g
chicken: 25-gr
Instructions:
qwe
qwe
RECIPE : CACIO E PEPE #PASTA
Ingredients:
carrot: 200-g
rabbit: 25-gr
Instructions:
qwe
qwe

Output got:

spaghetti: 200-g
butter: 25-gr
black pepper: as needed
pecorino: 50-gr
salt: 200-g
chicken: 25-gr
carrot: 200-g
rabbit: 25-gr

CodePudding user response:

This may help you:

start, stop = 0, 0
with open('recipes.txt', 'r') as f:
    lines = f.readlines()
for n in range(len(lines)):
    if 'Ingredients' in lines[n]:
        start = n   1
    elif 'Instructions' in lines[n]:
        stop = n
ingredients = list(filter(('\n').__ne__, lines[start:stop]))
for i in ingredients:
    print(i, end='')

Basically looks for the start and stop indexes, fetches the lines from that range and removes the empty lines (and extra new-line chars).

Output:

spaghetti: 200-g
butter: 25-gr
black pepper: as needed
pecorino: 50-gr

CodePudding user response:

My approach involves setting a variable is_ingredient to True or False, depending on the line and print if it is True.

is_ingredient = False
with open("recipes.txt", "r", encoding="utf-8") as stream:
    for line in stream:
        if line.startswith("Ingredients:"):
            is_ingredient = True
        elif line.startswith("Instructions:"):
            is_ingredient = False
            print("---")
        elif is_ingredient:
            print(line, end="")

The only addition I did was to print the --- as a separator between recipes.

  • Related