2011-01-04 12 views
5

Sono un dilettante che usa e disattiva Python da un po 'di tempo. Scusate se questa è una domanda stupida, ma mi chiedevo se qualcuno sapeva un modo semplice per afferrare un mucchio di linee se il formato del file di input è simile a questo:Come afferrare le linee DOPO una linea abbinata in pitone

" Intestazione 1

Linea 1

linea 2

linea 3

Rubrica 2

linea 1

Linea 2

Linea 3 "

io non so quante linee sono dopo ogni voce, ma voglio prendere tutti. Tutto quello che so è il nome, o un modello di espressione regolare per l'intestazione.

L'unico modo che conosco per leggere un file è il "per linea in file:" modo, ma non so come afferrare le linee DOPO la linea in cui sono attualmente attivo. Spero che questo abbia senso, e grazie per l'aiuto!

* Grazie per tutte le risposte! Ho cercato di implementare alcune soluzioni, ma il mio problema è che non tutte le intestazioni sono omonime e non sono sicuro di come aggirarle. Ho bisogno di un'espressione regolare diversa per ogni ... qualche suggerimento? *

+0

In risposta alla vostra modifica: è necessario avere un modo per identificare quali linee sono intestazioni. Potete fornire alcuni esempi reali? –

+0

Certo, ecco alcune espressioni regolari che sto usando per identificare le intestazioni, delimitate da //: '[0-9] + elementi comuni:' // '[0-9] + modelli con elementi [0-9]: '//' Model model_ [0-9] el_ [0-9] ' – toofly

+0

Non confondere questo problema (intestazione e dettagli) con un secondo problema, solo parzialmente correlato. Non aggiornare questo per aggiungere confusione. Primo: cerca SO per l'aiuto alle espressioni regolari. Secondo: Cerca tutorial su Python per la guida alle espressioni regolari. Terzo: dopo aver provato un codice che non funziona, crea una ** nuova ** domanda focalizzata sul tuo problema di espressione regolare. Con codice Questo non funziona. –

risposta

7

Generator Funzioni

def group_by_heading(some_source): 
    buffer= [] 
    for line in some_source: 
     if line.startswith("Heading"): 
      if buffer: yield buffer 
      buffer= [ line ] 
     else: 
      buffer.append(line) 
    yield buffer 

with open("some_file", "r") as source: 
    for heading_and_lines in group_by_heading(source): 
     heading= heading_and_lines[0] 
     lines= heading_and_lines[1:] 
     # process away. 
+0

+1, ma penso che tu intenda "buffer = [linea]" invece di "buffer = [titolo]". –

+0

Grazie! Questa è un'ottima soluzione (dovevo fare un po 'di lettura sulle funzioni del generatore). – toofly

+0

@toofly: se accetti la risposta di S.Lott, entrambi guadagnerai punti reputazione. –

0

io non so davvero Python, ma ecco un po 'di pseudocodice.

int header_found = 0;

[Iniziamo dove ciclo in cui si sta scorrendo righe di file di]

se (header_found == 1) [linea di afferrare]; header_found = 0;

if (riga = ~/[regexp per intestazione] /) header_found = 1;

L'idea è di avere una variabile che tenga traccia del fatto che tu abbia trovato o meno un'intestazione e, se lo hai, di prendere la riga successiva.

4

Si potrebbe utilizzare una variabile per segnare dove il quale voce si sta monitorando, e se è impostato, afferrare ogni linea fino a trovare un'altra voce:

data = {} 
for line in file: 
    line = line.strip() 
    if not line: continue 

    if line.startswith('Heading '): 
     if line not in data: data[line] = [] 
     heading = line 
     continue 

    data[heading].append(line) 

Ecco un frammento http://codepad.org che mostra come funziona : http://codepad.org/KA8zGS9E

Edit: Se non si preoccupano i valori vero titolo e vogliono solo un elenco, alla fine, è possibile utilizzare questo:

data = [] 
for line in file: 
    line = line.strip() 
    if not line: continue 

    if line.startswith('Heading '): 
     continue 

    data.append(line) 

In pratica, non è necessario tenere traccia di una variabile per l'intestazione, ma è sufficiente filtrare tutte le linee che corrispondono al modello di intestazione.

1

Diverso da un generatore, penso che possiamo creare un dict in cui la chiave è "Intestazione" e il valore è una lista per salvare le righe. Ecco il codice

odd_map = {} 
odd_list = [] 
with open(file, 'r') as myFile: 
    lines = myFile.readlines() 
    for line in lines: 
     if "Heading" in line: 
      odd_list = [] 
      odd_map[line.strip()] = odd_list 
     else:  
      odd_list.append(line.strip()) 

for company, odds in odd_map.items(): 
    print(company) 
    for odd in odds: 
     print(odd) 
Problemi correlati