2012-04-22 16 views
7

Szukam niektórych słów w pliku w Pythonie. Po znalezieniu każdego słowa muszę przeczytać następne dwa słowa z pliku. Szukałem jakiegoś rozwiązania, ale nie mogłem znaleźć lektury po kolejnych słowach.Przeczytaj następne słowo w pliku w pytonie

# 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 

Dziękuję za poświęcony czas.

Aktualizacja: wymagany jest tylko pierwszy wygląd. W tym przypadku możliwe jest tylko jedno pojawienie się tego słowa.

file:

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

słowo: [ 'dostęp', 'Algebra']

Przeszukiwanie pliku kiedy spotykamy 'dostępu' i 'algebra', muszę wartości 183 3145 i 153 16272 odpowiednio.

+1

Powinieneś zamieścić przykład tego, co twój plik wygląda najlepiej mi. – Akavall

+1

dla twojego ostatniego komentarza, masz na myśli następne dwa słowa po słowie, które znalazłeś w wierszu? Czy możesz podać przykładowe wejście/wyjście? – Levon

Odpowiedz

15

Łatwym sposobem radzenia sobie z tym jest odczytanie pliku za pomocą generatora, który dostarcza jedno słowo naraz z pliku.

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

Następnie znaleźć słowo, które Cię interesują i czytać kolejne dwa słowa:

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

Teraz foundwords[0] to słowo znaleźć, foundwords[1] to słowo po tym, i jest foundwords[2] drugie słowo po nim. Jeśli nie ma wystarczającej liczby słów, jeden lub więcej elementów listy będzie None.

To jest trochę bardziej skomplikowane, jeśli chcesz życie to pasuje tylko w jednej linii, ale zazwyczaj można uciec z uwzględnieniem plik jako tylko sekwencji słów.

+1

Myślę, że to prawda, ale osoba pytająca powinna określić, czy szuka tylko pierwszego pojawienia się tego słowa, czy wielu wystąpień. –

+2

Tak, potrzebujesz dodatkowej pętli, aby kontynuować, jeśli chcesz znaleźć wiele wystąpień. Łatwo to dodać. – kindall

+0

Dzięki za kod. Wprowadziłem kilka drobnych zmian i działało idealnie: line = line.split ("") –

2

Jeśli trzeba pobrać tylko dwa pierwsze słowa, po prostu to zrobić:

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

"następne dwie frazy po słowie [wyszukiwanie]" –

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] 

Dla 'dostępu', 'algebra' uzyskać ten wynik:

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