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 

फिर शब्द आप में रुचि रखते हैं खोजने के लिए और अगले दो शब्दों को पढ़ने में:

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[0] शब्द आप पाया है, 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 ']