2012-04-22 12 views
7

Estoy buscando algunas palabras en un archivo en python. Después de encontrar cada palabra, necesito leer las siguientes dos palabras del archivo. He buscado alguna solución pero no pude encontrar solo las siguientes palabras.Lea la siguiente palabra en un archivo en 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 

Gracias por su tiempo.

Actualización: Solo es necesaria la primera aparición. En realidad, solo una apariencia de la palabra es posible en este caso.

archivo:

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

palabra: [ 'acceso', 'álgebra']

Buscando el archivo cuando me encuentro con 'acceso' y 'álgebra', necesito los valores de 183 3145 y 153 16272 respectivamente.

+1

Deberías publicar un ejemplo de cómo luce tu archivo mi. – Akavall

+1

para su último comentario, ¿quiere decir las siguientes dos palabras después de la palabra que encontró en la línea? ¿Podría proporcionar alguna muestra de entrada/salida? – Levon

Respuesta

15

Una manera fácil de manejar esto es leer el archivo usando un generador que produce una palabra a la vez del archivo.

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

Luego de encontrar la palabra que le interesa y leer las dos palabras siguientes:

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

Ahora foundwords[0] es la palabra que has encontrado, foundwords[1] es la palabra después de eso, y es el foundwords[2] segunda palabra después de eso. Si no hay suficientes palabras, entonces uno o más elementos de la lista serán None.

Es un poco más complejo si desea forzar esto para que coincida solo dentro de una línea, pero por lo general puede salirse con la suya considerando el archivo como una secuencia de palabras.

+1

Creo que esto es correcto, pero el solicitante debe especificar si está buscando solo la primera aparición de la palabra o varias apariencias –

+2

Sí, necesita un bucle adicional para continuar si quiere encontrar varias ocurrencias. Eso es fácil de agregar. – kindall

+0

Gracias por el código. He hecho algunos cambios ligeros y está funcionando perfectamente: line = line.split ("") –

2

Si necesita recuperar solamente dos primeras palabras, sólo lo hacen:

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

"los siguientes dos términos después de la palabra [buscar]" –

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] 

Por 'acceso', 'álgebra' consigo este resultado:

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

Cuestiones relacionadas