web-dev-qa-db-fra.com

Obtenir le numéro de ligne de certaines phrases dans le fichier Python

Je dois obtenir le numéro de ligne d'une phrase dans un fichier texte. La phrase pourrait être:

the dog barked

Je dois ouvrir le fichier, rechercher cette phrase et imprimer le numéro de ligne.

J'utilise Python 2.6 sur Windows XP


C'est ce que j'ai:

o = open("C:/file.txt")
j = o.read()
if "the dog barked" in j:
     print "Found It"
else:
     print "Couldn't Find It"

Ce ne sont pas des devoirs, cela fait partie d'un projet sur lequel je travaille. Je ne sais même pas comment obtenir le numéro de ligne.

41
Zac Brown
lookup = 'the dog barked'

with open(filename) as myFile:
    for num, line in enumerate(myFile, 1):
        if lookup in line:
            print 'found at line:', num
78
Sacha
f = open('some_file.txt','r')
line_num = 0
search_phrase = "the dog barked"
for line in f.readlines():
    line_num += 1
    if line.find(search_phrase) >= 0:
        print line_num

EDIT 1.5 ans plus tard (après l'avoir vu, nous avons un autre vote positif): Je laisse ceci tel quel; mais si j'écrivais aujourd'hui, j'écrirais quelque chose de plus proche de la solution de Ash/suzanshakya: 

def line_num_for_phrase_in_file(phrase='the dog barked', filename='file.txt')
    with open(filename,'r') as f:
        for (i, line) in enumerate(f):
            if phrase in line:
                return i
    return -1
  • L’utilisation de with pour ouvrir des fichiers correspond à l’idiome Pythonic - cela garantit que le fichier sera correctement fermé lorsque le bloc qui utilise le fichier se termine. 
  • Itérer dans un fichier en utilisant for line in f est beaucoup mieux que for line in f.readlines(). Le premier est Pythonic (par exemple, fonctionnerait si f est un itératif générique; ce n'est pas nécessairement un objet fichier qui implémente readlines) et si plus efficace f.readlines() crée une liste avec le fichier entier en mémoire, puis itère à travers celui-ci. * if search_phrase in line est plus Pythonic que if line.find(search_phrase) >= 0, car il ne nécessite pas line pour implémenter find, lit plus facilement pour voir ce qui est prévu, et n'est pas facilement foiré (par exemple, if line.find(search_phrase) et if line.find(search_phrase) > 0 ne fonctionneront pas dans tous les cas car find find l'index de la première correspondance ou -1). 
  • Il est plus simple et plus propre d’envelopper un élément itéré dans enumerate comme for i, line in enumerate(f) plutôt que d’initialiser line_num = 0 avant la boucle, puis de l’incrémenter manuellement dans la boucle. (Bien que ce soit discutable, il est plus difficile à lire pour les personnes inconnues de enumerate.) 

See code like pythonista

6
dr jimbob
def get_line_number(phrase, file_name):
    with open(file_name) as f:
        for i, line in enumerate(f, 1):
            if phrase in line:
                return i
4
suzanshakya

suzanshakya , je suis en train de modifier votre code. Je pense que cela simplifiera le code, mais assurez-vous qu'avant d'exécuter le code, le fichier doit se trouver dans le même répertoire de la console, sinon l'erreur entraînera une erreur.

lookup="The_String_You're_Searching"
file_name = open("file.txt")
for num, line in enumerate(file_name,1):
        if lookup in line:
            print(num)
2
Amarjeet Ranasingh
list = open("file_name","mode")

if "search element" in list:
    print list.index("search element")  # This will gives you the line number
1
M. kavin babu

Ouvrez votre fichier, puis faites quelque chose comme ...

for line in f:
    nlines += 1
    if (line.find(phrase) >= 0):
        print "Its here.", nlines

Il existe de nombreuses façons de lire des lignes dans des fichiers en Python, mais la technique for line in f est plus efficace que la plupart.

1
slezica
for n,line in enumerate(open("file")):
    if "pattern" in line: print n+1
0
ghostdog74

Voici ce que j'ai trouvé au travail:

f_rd = open(path, 'r')
file_lines = f_rd.readlines()
f_rd.close()

matches = [line for line in file_lines if "chars of Interest" in line]
index = file_lines.index(matches[0])
0
Onkar Raut