imprimir el primer párrafo en python

Tengo un libro en un archivo de texto y necesito imprimir el primer párrafo de cada sección. Pensé que si encontraba un texto entre \ n \ ny \ n puedo encontrar mi respuesta. Aquí están mis códigos y no funcionó. ¿Puedes decirme que me equivoco?

lines = [line.rstrip('\n') for line in open('G:\\aa.txt')] check = -1 first = 0 last = 0 for i in range(len(lines)): if lines[i] == "": if lines[i+1]=="": check = 1 first = i +2 if i+2< len(lines): if lines[i+2] == "" and check == 1: last = i+2 while (first < last): print(lines[first]) first = first + 1 

También encontré un código en stackoverflow. Lo probé también pero solo imprimió una matriz vacía.

 f = open("G:\\aa.txt").readlines() flag=False for line in f: if line.startswith('\n\n'): flag=False if flag: print(line) elif line.strip().endswith('\n'): flag=True 

Compartí una sección de muestra de este libro en belown.

yo

LA LAY DE LA TIERRA

Hay un vasto campo de interés humano fascinante, que se encuentra justo afuera de nuestras puertas, que hasta ahora ha sido poco explorado. Es el Campo de la Inteligencia Animal.

De todos los tipos de interés relacionados con el estudio de los animales salvajes del mundo, no hay ninguno que supere el estudio de sus mentes, su moral y los actos que realizan como resultado de sus procesos mentales.

II

TEMPERAMENTO ANIMAL E INDIVIDUALIDAD

Lo que estoy tratando de hacer aquí es encontrar las líneas en mayúsculas y colocarlas todas en una matriz. Luego, utilizando el método de índice, encontraré los primeros y últimos párrafos de cada sección comparando los índices de estos elementos de esta matriz que creé.

La salida debería ser así:

Hay un vasto campo de interés humano fascinante, que se encuentra justo afuera de nuestras puertas, que hasta ahora ha sido poco explorado. Es el Campo de la Inteligencia Animal.

Lo que estoy tratando de hacer aquí es encontrar las líneas en mayúsculas y colocarlas todas en una matriz. Luego, utilizando el método de índice, encontraré los primeros y últimos párrafos de cada sección comparando los índices de estos elementos de esta matriz que creé.

Si desea agrupar las secciones, puede usar itertools.groupby usando líneas vacías como delimitadores:

 from itertools import groupby with open("in.txt") as f: for k, sec in groupby(f,key=lambda x: bool(x.strip())): if k: print(list(sec)) 

Con algunos más itertools foo podemos obtener las secciones usando el título en mayúsculas como delimitador:

 from itertools import groupby, takewhile with open("in.txt") as f: grps = groupby(f,key=lambda x: x.isupper()) for k, sec in grps: # if we hit a title line if k: # pull all paragraphs v = next(grps)[1] # skip two empty lines after title next(v,""), next(v,"") # take all lines up to next empty line/second paragraph print(list(takewhile(lambda x: bool(x.strip()), v))) 

Lo que te daría:

 ['There is a vast field of fascinating human interest, lying only just outside our doors, which as yet has been but little explored. It is the Field of Animal Intelligence.\n'] ['What I am trying to do here is, find the uppercase lines, and put them all in an array. Then, using the index method, I will find the first and last paragraphs of each section by comparing the indexes of these elements of this array I created.'] 

El inicio de cada sección tiene un título en mayúsculas, así que una vez que tengamos éxito, sabemos que hay dos líneas vacías, luego el primer párrafo y el patrón se repite.

Para romperlo usando bucles:

 from itertools import groupby from itertools import groupby def parse_sec(bk): with open(bk) as f: grps = groupby(f, key=lambda x: bool(x.isupper())) for k, sec in grps: if k: print("First paragraph from section titled :{}".format(next(sec).rstrip())) v = next(grps)[1] next(v, ""),next(v,"") for line in v: if not line.strip(): break print(line) 

Para su texto:

 In [11]: cat -E in.txt THE LAY OF THE LAND$ $ $ There is a vast field of fascinating human interest, lying only just outside our doors, which as yet has been but little explored. It is the Field of Animal Intelligence.$ $ Of all the kinds of interest attaching to the study of the world's wild animals, there are none that surpass the study of their minds, their morals, and the acts that they perform as the results of their mental processes.$ $ $ WILD ANIMAL TEMPERAMENT & INDIVIDUALITY$ $ $ What I am trying to do here is, find the uppercase lines, and put them all in an array. Then, using the index method, I will find the first and last paragraphs of each section by comparing the indexes of these elements of this array I created. 

Los signos del dólar son las nuevas líneas, la salida es:

 In [12]: parse_sec("in.txt") First paragraph from section titled :THE LAY OF THE LAND There is a vast field of fascinating human interest, lying only just outside our doors, which as yet has been but little explored. It is the Field of Animal Intelligence. First paragraph from section titled :WILD ANIMAL TEMPERAMENT & INDIVIDUALITY What I am trying to do here is, find the uppercase lines, and put them all in an array. Then, using the index method, I will find the first and last paragraphs of each section by comparing the indexes of these elements of this array I created. 

Siempre hay expresiones regulares …

 import re with open("in.txt", "r") as fi: data = fi.read() paras = re.findall(r""" [IVXLCDM]+\n\n # Line of Roman numeral characters [^az]+\n\n # Line without lower case characters (.*?)\n # First paragraph line """, data, re.VERBOSE) print "\n\n".join(paras) 

Repase el código que ha encontrado, línea por línea.

 f = open("G:\\aa.txt").readlines() flag=False for line in f: if line.startswith('\n\n'): flag=True if flag: print(line) elif line.strip().endswith('\n'): flag=True 

Parece que nunca establece la variable de bandera como verdadera.

Y si puede compartir algunas muestras de su libro, será más útil para todos.

Esto debería funcionar, siempre que no haya párrafos con mayúsculas:

  f = open('file.txt') for line in f: line = line.strip() if line: for c in line: if c < 'A' or c > 'Z': # check for non-uppercase chars break else: # means the line is made of all caps ie I, II, etc, meaning new section f.readline() # discard chapter headers and empty lines f.readline() f.readline() print(f.readline().rstrip()) # print first paragraph f.close() 

Si también desea obtener el último párrafo, puede hacer un seguimiento de la línea vista por última vez que contenía caracteres en minúscula y, tan pronto como encuentre una línea en mayúscula (I, II, etc.), indicando una nueva sección, imprima La línea más reciente, ya que sería el último párrafo de la sección anterior.

Solución TXR

 $ txr firstpar.txr datos
 Hay un vasto campo de interés humano fascinante, que se encuentra justo afuera de nuestras puertas, que hasta ahora ha sido poco explorado.  Es el Campo de la Inteligencia Animal.
 Lo que estoy tratando de hacer aquí es encontrar las líneas en mayúsculas y colocarlas todas en una matriz.  Luego, utilizando el método de índice, encontraré los primeros y últimos párrafos de cada sección comparando los índices de estos elementos de esta matriz que creé.

Código en firstpar.txr :

 @(repetir)
 @num

 @título

 @firstpar
 @ (requiere (y (<(número de longitud) 5)
                  [algún título chr-isupper]
                  (no [algún título chr-islower])))
 @ (do (put-line firstpar))
 @(fin)

Básicamente, estamos buscando en la entrada una coincidencia de patrón para el patrón multilínea de tres elementos que une las variables num , title y firstpar . Ahora este patrón, como tal, puede coincidir en lugares equivocados, así que agregue algunas heurísticas de restricción con una aserción require . Se requiere que el número de la sección sea una línea corta, y una línea de título debe contener algunas letras mayúsculas y no minúsculas. Esta expresión está escrita en TXR Lisp.

Si obtenemos una coincidencia con esta restricción, firstpar la cadena capturada en la variable firstpar .