with tutorial framework español djangoproject desde con cero applications python file linecache

tutorial - python: lee el archivo desde y hacia líneas de texto específicas



tutorial django (4)

Esto debería ser un comienzo para ti:

started = False collected_lines = [] with open(path, "r") as fp: for i, line in enumerate(fp.readlines()): if line.rstrip() == "Start": started = True print "started at line", i # counts from zero ! continue if started and line.rstrip()=="End": print "end at line", i break # process line collected_lines.append(line.rstrip())

El generador de enumerate toma un generador y enumera las iteraciones. P.ej.

print list(enumerate("a b c".split()))

huellas dactilares

[ (0, "a"), (1,"b"), (2, "c") ]

ACTUALIZAR :

el póster solicitó usar una expresión regular para hacer coincidir líneas como "===" y "======":

import re print re.match("^=+$", "===") is not None print re.match("^=+$", "======") is not None print re.match("^=+$", "=") is not None print re.match("^=+$", "=abc") is not None print re.match("^=+$", "abc=") is not None

No estoy hablando de números de línea específicos porque estoy leyendo varios archivos con el mismo formato pero varían en longitud.
Digamos que tengo este archivo de texto:

Something here... ... ... ... Start #I want this block of text a b c d e f g h i j k l m n End #until this line of the file something here... ... ... ...

Espero que sepas a qué me refiero. Estaba pensando en iterar a través del archivo y luego buscar usando la expresión regular para encontrar el número de línea de "Inicio" y "Finalizar", luego uso el caché de línea para leer desde la línea de inicio hasta la línea de finalización. Pero, ¿cómo obtener el número de línea? ¿Qué función puedo usar?


Puedes usar una expresión regular con bastante facilidad. Puede hacerlo más robusto según sea necesario, a continuación se muestra un ejemplo simple.

>>> import re >>> START = "some" >>> END = "Hello" >>> test = "this is some/nsample text/nthat has the/nwords Hello World/n" >>> m = re.compile(r''%s.*?%s'' % (START,END),re.S) >>> m.search(test).group(0) ''some/nsample text/nthat has the/nwords Hello''


Aquí hay algo que funcionará:

data_file = open("test.txt") block = "" found = False for line in data_file: if found: block += line if line.strip() == "End": break else: if line.strip() == "Start": found = True block = "Start" data_file.close()


Si simplemente desea el bloque de texto entre el inicio y el final, puede hacer algo simple como:

with open(''test.txt'') as input_data: # Skips text before the beginning of the interesting block: for line in input_data: if line.strip() == ''Start'': # Or whatever test is needed break # Reads text until the end of the block: for line in input_data: # This keeps reading the file if line.strip() == ''End'': break print line # Line is extracted (or block_of_lines.append(line), etc.)

De hecho, no es necesario manipular los números de línea para leer los datos entre los marcadores de Inicio y Fin.

La lógica ("leer hasta ...") se repite en ambos bloques, pero es bastante clara y eficiente (otros métodos generalmente implican verificar algún estado [antes del bloque / dentro del bloque / final del bloque alcanzado], que incurre en una penalización de tiempo).