web-dev-qa-db-fra.com

Python - Recherche le numéro de ligne dans un fichier texte

J'écris un code qui regarde dans un fichier texte et voit si l'entrée y est.

par exemple.

je saisis "pizza"

Mon fichier texte contient:

bread
pizza
pasta
tomato

Je veux trouver un moyen d'imprimer le numéro de ligne sur lequel se trouve la pizza Word. Une aide?

5
googlecoolcat
with open('test.txt') as f:
    content = f.readlines()

index = [x for x in range(len(content)) if 'pizza' in content[x].lower()]

La partie (1) du code lit chaque ligne comme une liste distincte dans la variable "contenu".

La partie (2) remplit la ligne de contenu uniquement si "pizza" existe dans cette ligne. [x pour x dans la plage (len (content))] remplit simplement toutes les valeurs d'index, tandis que "si" pizza "dans le contenu [x] .lower ()" conserve la ligne # qui correspond à la chaîne.

4
Oxymoron88

Il y a deux façons d'y parvenir:

  1. Stocker l'intégralité du fichier en mémoire pour ne le lire qu'une seule fois
  2. Lecture du fichier à chaque recherche, mais sans avoir à le stocker

Pour la méthode 1, lisez d'abord chaque ligne, puis récupérez l'index sur lequel se trouve Word:

with open('path.txt') as f: data = f.readlines()
line_no = data.index("pizza")

Vous pouvez également parcourir le fichier pour trouver l'index:

with open('path.txt') as f:
    for line_no, line in enumerate(f):
        if line == "pizza":
            break
    else: # for loop ended => line not found
        line_no = -1
4
Rushy Panchal

Quelque chose comme ça ?

import re
import os # You can go without is if you have other means to get your filepath

i = 1
matches = []
target = raw_input("Please type string to match\n")
with open(os.getenv("SOME_PATH") + "/myfile.txt") as fic: # open("myfile.txt") if in your current directory
     for line in fic:
         if re.search(target, line):
             print "Found at line {}".format(i)
             matches.append(i)
         i = i +1
if not len(matches):
    raise Exception, "target not found"

En faisant cela, vous pouvez entrer une expression régulière et cela devrait fonctionner (c'est-à-dire que si vous entrez "p.zza" ou "^ p. *", Cela fonctionnera.). La liste matches contiendra tous les index des lignes qui correspondent au modèle d'entrée.

1
Valentin B.
print next (i for i,v in enumerate (open (fname),1) if v == needle)
0
Joran Beasley