2012-04-22 10 views
7

Sto cercando alcune parole in un file in python. Dopo aver trovato ogni parola ho bisogno di leggere le prossime due parole dal file. Ho cercato qualche soluzione ma non sono riuscito a trovare solo le parole successive.Leggi la parola successiva in un file in python

# offsetFile - file pointer 
# searchTerms - list of words 

for line in offsetFile: 
    for word in searchTerms: 
     if word in line: 
      # here get the next two terms after the word 

Grazie per il vostro tempo.

Aggiornamento: è necessaria solo la prima apparizione. In realtà solo una comparsa della parola è possibile in questo caso.

di file:

accept 42 2820 access 183 3145 accid 1 4589 algebra 153 16272 algem 4 17439 algol 202 6530 

parola: [ 'accesso', 'algebra']

Cercando il file quando incontro 'accesso' e 'algebra', ho bisogno dei valori di 183 3145 e 153 16272 rispettivamente.

+1

Dovresti pubblicare un esempio di come appare il tuo file lik e. – Akavall

+1

per il tuo ultimo commento, intendi le prossime due parole dopo la parola che hai trovato nella riga? Potresti fornire qualche esempio di input/output? – Levon

risposta

15

Un modo semplice per gestire questo è leggere il file utilizzando un generatore che restituisce una parola alla volta dal file.

def words(fileobj): 
    for line in fileobj: 
     for word in line.split(): 
      yield word 

Poi per trovare la parola che ti interessa e leggere i prossimi due parole:

with open("offsetfile.txt") as wordfile: 
    wordgen = words(wordfile) 
    for word in wordgen: 
     if word in searchterms: # searchterms should be a set() to make this fast 
      break 
    else: 
     word = None    # makes sure word is None if the word wasn't found 

    foundwords = [word, next(wordgen, None), next(wordgen, None)] 

Ora foundwords[0] è la parola che hai trovato, foundwords[1] è la parola dopo che, ed è il foundwords[2] seconda parola dopo. Se non ci sono abbastanza parole, uno o più elementi dell'elenco saranno None.

È un po 'più complesso se si desidera forza per corrispondere solo all'interno di una riga, ma in genere è possibile farla franca considerando il file come una semplice sequenza di parole.

+1

Penso che sia giusto, ma il richiedente deve specificare se sta cercando solo la prima apparizione della parola o più aspetti –

+2

Sì, è necessario un ciclo aggiuntivo per continuare se si desidera trovare più occorrenze. È facile da aggiungere. – kindall

+0

Grazie per il codice. Ho apportato alcune piccole modifiche e funziona perfettamente: line = line.split ("") –

2

Se avete bisogno di recuperare solo due prime parole, basta farlo:

 
offsetFile.readline().split()[:2] 
+1

"i prossimi due termini dopo la parola [ricerca]" –

1
word = '3' #Your word 
delim = ',' #Your delim 

with open('test_file.txt') as f: 
    for line in f: 
     if word in line: 
      s_line = line.strip().split(delim) 
      two_words = (s_line[s_line.index(word) + 1],\ 
      s_line[s_line.index(word) + 2]) 
      break 
1
def searchTerm(offsetFile, searchTerms): 
      # remove any found words from this list; if empty we can exit 
      searchThese = searchTerms[:] 
      for line in offsetFile: 
        words_in_line = line.split() 
        # Use this list comprehension if always two numbers continue a word. 
        # Else use words_in_line. 
        for word in [w for i, w in enumerate(words_in_line) if i % 3 == 0]: 
          # No more words to search. 
          if not searchThese: 
            return 
          # Search remaining words. 
          if word in searchThese: 
            searchThese.remove(word) 
            i = words_in_line.index(word) 
            print words_in_line[i:i+3] 

Per 'accesso', 'algebra' ottengo questo risultato:

[' access ',' 183 ',' 3145 ']
[' algebra ',' 153 ',' 16272 ']