2016-01-02 12 views
6

Ho un libro in un file di testo e ho bisogno di stampare il primo paragrafo di ogni sezione. Ho pensato che se ho trovato un testo tra \ n \ n e \ n posso trovare la mia risposta. Ecco i miei codici e non ha funzionato. Puoi dirmi che dove sbaglio?stampa il primo paragrafo in pitone

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 

Inoltre ho trovato un codice in StackOverflow l'ho provato anche io ma ha appena stampato un array vuoto.

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 

Ho condiviso una sezione campione di questo libro in belown.

ho

LA configurazione del terreno

C'è un vasto campo di affascinante interesse umano, che giace appena fuori le nostre porte, che finora è stato poco esplorati. È il campo dell'intelligenza animale.

Di tutti i tipi di interesse legati allo studio degli animali selvaggi del mondo, non c'è nessuno che superi lo studio delle loro menti, la loro morale e gli atti che essi svolgono come risultato dei loro processi mentali.

II

Wild Animal CARATTERE & INDIVIDUALITÀ

Quello che sto cercando di fare qui è, trovare le linee maiuscole, e metterli tutti in un array. Quindi, utilizzando il metodo index, troverò il primo e l'ultimo paragrafo di ogni sezione confrontando gli indici di questi elementi di questo array che ho creato.

uscita dovrebbe essere simile a questo:

C'è un vasto campo di affascinante interesse umano, che giace appena fuori le nostre porte, che finora è stato poco esplorati. È il campo dell'intelligenza animale.

Quello che sto cercando di fare qui è, trovare le linee maiuscole e metterle tutte in un array. Quindi, utilizzando il metodo index, troverò il primo e l'ultimo paragrafo di ogni sezione confrontando gli indici di questi elementi di questo array che ho creato.

+0

È possibile aggiungere l'ingresso effettivo così com'è e l'uscita prevista? –

risposta

6

Se si desidera raggruppare le sezioni che è possibile utilizzare itertools.groupby utilizzando le linee vuote come i delimitatori:

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 qualche itertools Foo possiamo ottenere sezioni con il titolo in maiuscolo come delimitatore:

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

che darebbe:

['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.'] 

L'inizio di ogni sezione ha un titolo tutto maiuscolo, quindi una volta che ci siamo accorti sappiamo che ci sono due righe vuote, quindi il primo paragrafo e le ripetizioni del pattern.

romperlo in utilizzando i cicli:

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) 

Per il testo:

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. 

Giusto sono le nuove linee, l'output è:

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. 
+0

È bello, posso vedere ogni sezione usando questo codice ... ma voglio solo vedere i primi paragrafi di essi .. Come posso estrarre? –

+0

@ TuğcanDemir, che cosa vuoi esattamente estrarre dalla tua domanda? –

+0

Ho modificato la mia domanda. –

0

Superare il codice trovato, riga per riga.

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 

Sembra che non imposti mai la variabile flag come vera.

E se è possibile condividere alcuni campioni dal tuo libro, sarà più utile per tutti.

+0

Ho condiviso lo stesso codice che hai condiviso, basta impostare il flag su true in first if block. –

+0

Quando imposto il primo flag su true, aggiunge altre 2 righe vuote su ogni riga. –

0

Questo dovrebbe lavoro, purché non ci siano paragrafi con maiuscole:

Se si desidera ottenere anche l'ultimo paragrafo, è possibile tenere traccia della linea visualizzata l'ultima volta che conteneva caratteri minuscoli e quindi non appena si trova una linea tutta maiuscola (I, II, ecc.), Che indica una nuova sezione, quindi si stampa la riga più recente, poiché quello sarebbe l'ultimo paragrafo nella sezione precedente.

+0

Stampa molte righe vuote tra 2 frasi discrete ... –

+0

@ TuğcanDemir Ho apportato alcune piccole modifiche per rimuovere le righe vuote e rendere il codice più leggibile. Questo codice (e la versione precedente) ha funzionato con l'esempio che hai fornito sopra. Puoi fornire la sezione di esempio che ti ha dato quei risultati? – TisteAndii

1

C'è sempre regex ....

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

Questo è uno stampo in crescita: "Alcune persone, di fronte a un problema, pensano:" Lo so, userò le espressioni regolari ". [Ora hanno due problemi] (http://blog.codinghorror.com/regular-expressions-now-you-have-two-problems/). " '[IV] +' huh? – msw

+0

Come posso stampare il primo paragrafo anziché la prima riga? –

+0

quindi, trovo il modo di usarlo anche con il tuo codice ... grazie mille :) –

0

TXR soluzione

 
$ txr firstpar.txr data 
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. 
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. 

Codice in firstpar.txr:

 
@(repeat) 
@num 

@title 

@firstpar 
@ (require (and (< (length num) 5) 
       [some title chr-isupper] 
       (not [some title chr-islower]))) 
@ (do (put-line firstpar)) 
@(end) 

Fondamentalmente stiamo cercando l'input per un pattern match per il motivo a più righe a tre elementi che lega lo num, title e firstpar variabili. Ora questo modello, come tale, può corrispondere in posti sbagliati, quindi aggiungere qualche euristica vincolante con un'asserzione require. Il numero della sezione deve essere una linea breve e una riga del titolo deve contenere alcune lettere maiuscole e nessuna minuscole. Questa espressione è scritta in TXR Lisp.

Se otteniamo una corrispondenza con questo vincolo, restituiamo la stringa catturata nella variabile firstpar.