2010-10-18 9 views
32

Necesito obtener el número de línea de una frase en un archivo de texto. La frase podría ser:Obtener línea Número de cierta frase en el archivo Python

the dog barked 

Necesito abrir el archivo, buscar la frase e imprimir el número de línea.

estoy usando Python 2.6 en Windows XP


Esto es lo que tengo:

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

Ésta no es la tarea, que es parte de un proyecto que estoy trabajando . Ni siquiera tengo ni idea de cómo obtener el número de línea.

+3

es esta tarea? –

+0

¿Qué tienes hasta ahora? Quiero decir, sabemos que sabes cómo abrir un archivo. ¿Cómo estás buscando la frase? – SilentGhost

+1

@SilentGhost, soy un programador de Python muy fuerte. Simplemente nunca tuve que hacer esto antes. He escrito varias aplicaciones, específicamente una aplicación web de control parental que la compañía lanzará en los próximos meses. Solo golpea una "célula cerebral muerta", eso es todo. –

Respuesta

60
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 
+3

Gracias por publicar * la forma correcta (tm) * de hacerlo (bueno, excepto que el recuento de líneas comienza en 0 - está bien para los programadores, pero no para los que no son expertos en tecnología). +1 – delnan

+0

Esto es lo que funcionó. Ahora, solo una pregunta ... ¿sabes cómo leer un número de línea específico en un archivo de texto? –

+2

En Python 2.6 y posterior, creo que, 'enumerate()' toma un argumento del número para comenzar a contar, por ej. 'enumerate (myFile, 1)'. – hughdbrown

1

abrir su archivo, y luego hacer algo como ...

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

Hay numerosas maneras de leer las líneas de archivos en Python, pero la técnica for line in f es más eficiente que la mayoría.

+1

¿Mal? ¿Dónde? ...? Si es el> en lugar de> =, lo arreglé, tienes razón, y ... podrías haberlo señalado en lugar de decir que la respuesta fue incorrecta y embarazosa. – slezica

+0

@santi: la vergüenza estaba escribiendo código c en python. Ver la respuesta de Sacha – SilentGhost

+0

Sí, no pude hacerlo funcionar. Gracias por publicarlo. –

5
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 

EDITAR 1.5 años después (después de verlo obtener otro voto popular): Me voy a dejar como está; pero si yo estaba escribiendo hoy escribiría algo más cercano a la solución de ceniza/de 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 
  • Usando with para abrir archivos es el idioma Pythonic - asegura el archivo se cierra correctamente cuando el bloque mediante el archivo termina.
  • Iterar a través de un archivo usando for line in f es mucho mejor que for line in f.readlines(). El primero es pythonic (por ejemplo, funcionaría si f es cualquier iterable genérico, no necesariamente un objeto de archivo que implementa readlines), y f.readlines() más eficiente crea una lista con todo el archivo en la memoria y luego lo itera. * if search_phrase in line es más Pythonic que if line.find(search_phrase) >= 0, ya que no requiere line para implementar find, se lee más fácilmente a ver lo que está destinado y no se atornilla fácilmente (por ejemplo, if line.find(search_phrase) y if line.find(search_phrase) > 0 tanto no va a funcionar para todos los casos como encontrar retornos el índice de la primera coincidencia o -1).
  • Es más simple/limpiador para envolver un elemento iterado en enumerate como for i, line in enumerate(f) que para inicializar line_num = 0 antes del ciclo y luego incrementarlo manualmente en el ciclo. (Aunque podría decirse que es más difícil de leer para personas que no están familiarizadas con enumerate.)

Ver code like pythonista

+0

Esto es similar a la solución de Santiago; excepto que debe ser> = 0, como si estuviera al principio de la línea, find devolverá 0 si la frase está presente. (Si no está allí, será -1). –

+0

-1 para volver a 0. Usar readlines rara vez es una buena idea, simplemente itere el archivo. – delnan

+0

En la función line_num_for_phrase_in_file, ¿es IF PHRASE IN F, o IF PHRASE IN LINE? –

4
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 
+1

Usaría 'return None' en lugar de' return 0' pero esto es bueno. –

+0

He usado 'return 0' para hacer el tipo de retorno del entero' get_line_number'. ¿Por qué crees que 'return None' es mejor? – suzanshakya

+1

'None' deja en claro que la frase no se encontró, mientras que' 0' es solo una convención. También asegura que si el llamador no verifica el resultado, el programa probablemente fallará de manera espectacular cuando se active el error, haciendo que la depuración sea más fácil. –

0
for n,line in enumerate(open("file")): 
    if "pattern" in line: print n+1 
1
list = open("file_name","mode") 

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

Esto devuelve el número de personaje en lugar del número de línea. – Lydia

0

Esto es lo que he encontrado para trabajar:

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

suzanshakya, en realidad estoy modificando su código , Yo delgado Esto simplificará el código, pero asegúrese de que antes de ejecutar el código, el archivo debe estar en el mismo directorio de la consola, de lo contrario obtendrá un error.

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) 
Cuestiones relacionadas