2012-04-22 4 views
7

파이썬의 파일에서 단어를 찾고 있습니다. 각 단어를 찾은 후 파일에서 다음 두 단어를 읽어야합니다. 몇 가지 해결책을 찾았지만 다음 단어를 읽지 못했습니다.파이썬의 파일에서 다음 단어를 읽으십시오.

# 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 

감사합니다.

업데이트 : 첫 번째 모습 만 필요합니다. 사실이 경우 단어의 한 가지 모양 만 가능합니다.

파일 :

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

단어 : [ '액세스', '대수']

내가 '액세스'가 발생할 때 파일을 검색하고 '대수', 나는 183 3145의 값을 필요로하고 153 16272에 각각 기재되어있다.

+1

파일이 어떻게 보이는지 예를 게시해야합니다 이자형. 지난 번 코멘트에 – Akavall

+1

을 입력하셨습니까? 라인에서 찾은 단어 다음 두 단어를 의미합니까? 샘플 입/출력을 제공 할 수 있습니까? – Levon

답변

15

이 문제를 쉽게 해결할 수있는 방법은 파일에서 한 번에 한 단어 씩 생성기를 사용하여 파일을 읽는 것입니다.

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

그리고 관심있는 단어를 찾아 다음 두 단어 읽기 : 이제 foundwords[0]

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

찾은 단어는, foundwords[1] 그 이후 단어가, 그리고 foundwords[2]는이다 그 다음의 두 번째 단어. 단어가 충분하지 않으면 목록의 하나 이상의 요소가 None이됩니다.

을 한 줄 내에서만 일치 시키려면 좀 더 복잡하지만 일반적으로 파일을 일련의 단어로 간주하면 문제를 해결할 수 있습니다. 당신은 두 첫번째 단어를 검색해야하는 경우

+1

나는 이것이 옳다고 생각하지만, 묻는 사람은 단어의 첫 등장이나 복수의 출연을 찾고 있는지를 지정해야만한다. –

+2

예, 여러 번 찾으려면 계속 진행하기 위해 추가 루프가 필요하다. 추가하기 쉽습니다. – kindall

+0

코드 주셔서 감사합니다. 나는 약간의 변경과 그 작업을 완벽하게 수행했습니다 : line = line.split ("") –

2

, 그냥 해 :

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

"[검색] 단어 다음 두 용어" –

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] 

나는이 결과를 얻을 :

[ '을 액세스 ','183 ','3145 ']
['대수 ','153 ','16272 ']

관련 문제