2016-12-15 7 views
0

私はいくつかの他のフォルダを含むフォルダを持っていて、それぞれには32214個のファイルに関する多くのテキストファイルが含まれています。私は特定の単語の前と後に5単語を印刷したいと思います。私のコードはこれらのすべてのファイルを読むべきです。以下のコードは動作しますが、すべてのファイルを読み込んで文章を抽出するのに約8時間かかります。数分で文章を読み込んで印刷できるように、コードを変更するにはどうすればよいですか?すべてのファイルをアクセスするために使用os.walk(言語はペルシャ語である)テキストファイル内の特定の単語の前後の単語を取得する

. 
. 
. 
def extact_sentence(): 
    f= open ("پاکت", "w", encoding = "utf-8") 
    y = "پاکت" 
    text= normal_text(folder_path) # the first function to normalize the files 
    for i in text: 
     for line in i: 
      split_line = line.split() 
      if y in split_line: 
       index = split_line.index(y) 
       d = (' '.join(split_line[max(0,index-5):min(index+6,len(split_line))])) 
       f.write(d + "\n") 
    f.close() 

enter image description here

+0

各ファイルを1/1000秒以下で処理できると思いますか? –

+0

コード自体をスピードアップするためにできることが非常にあるかどうかはわかりませんが、ボトルネックはおそらくasyncioでスピードアップできるハードドライブのアクセスだと思いますが、速度は –

+0

で、 'normal_text'はすべてのファイルを一度にメモリにロードしますか?あなたは 'normal_text'を書いていましたか?そこでは最適化が可能です。 –

答えて

0

import os 


def getRollingWindow(seq, w): 
    win = [next(seq) for _ in range(window_size)] 
    yield win 
    for e in seq: 
     win[:-1] = win[1:] 
     win[-1] = e 
     yield win 


def extractSentences(rootDir, searchWord): 
    with open("پاکت", "w", encoding="utf-8") as outfile: 
     for root, _dirs, fnames in os.walk(rootDir): 
      for fname in fnames: 
       print("Looking in", os.path.join(root, fname)) 
       with open(os.path.join(root, fname)) as infile: 
        for window in getRollingWindow(word for line in infile for word in line.split(), 11): 
         if window[5] != searchWord: continue 
         outfile.write(' '.join(window)) 
+0

NameError:名前 'infile'が定義されていません – sara

+0

@サラ:おっと!今度は固定 – inspectorG4dget

+0

私は容赦しますが、もう一度別のエラーがあります:でcntのためのwin = [seq.next()] 'Generator'オブジェクトに 'next'属性がありません – sara

関連する問題