2017-11-10 13 views
2

アルファベットを含むすべてのスペース区切りフィールドのテキストファイルをスキャンするユーティリティを作成しましたが、機能は素晴らしいですが、すべての行を単語に分割し、これを行うより速い方法がありますか?テキストファイル内のすべての単語を高速に検索する

ありがとうございました。ここで

コードです:

#!/bin/python 
import argparse 
import sys 
import time 

parser = argparse.ArgumentParser(description='Find all alpha characters in 
an input file') 
parser.add_argument('file', type=argparse.FileType('r'), 
help='filename.txt') 

args = parser.parse_args() 

def letters(input): 
    output = [] 
    for character in input: 
     if character.isalpha(): 
      output = input 
    return output 

def main(argv): 

    start = time.time() 
    fname = sys.argv[1] 

    f = open(fname) 
    for line in f: 
     words = line.rstrip().split() 
     for word in words: 
      alphaWord = letters(word) 
      if alphaWord: 
       print(alphaWord) 
    f.close() 

    end = time.time() 
    elapsed = end - start 
    print "%s secs elapsed" % elapsed 

if __name__ == "__main__": 
    main(sys.argv) 
+1

'str'はPythonのキーワードです。変数名として使用しないでください! – alfasin

+0

ありがとう、私はそれを修正した。 – iheartcpp

+0

'filter(str.isalpha、line.split())'が速くなるよ、私は助けてくれる –

答えて

5

あなたのプログラムがletters()にバグがあります。

def letters(input): 
    output = [] 
    for character in input: 
     if character.isalpha(): 
      output = input # after we get here we'll keep iterating 
          # even though the result will not change 
    return output 

何をやっている、すべての文字を反復し、そのうちの一つは、英数字であっても、あなたは入力をoutputに保存しますが、残りの文字を反復し続けます。何も追加しません。

すべての文字をチェックしたい場合(またはプログラムが間違った結果を返す)、プログラムが正しい結果を返した場合は、output = inputの行の後にbreakとします。それはあなたが持っているので、もしそれが言葉のうち、番号をストリッピングされるだろう言葉を返さなかった場合でも、アレイ

に追加されませんので、これはそれが唯一の文字を返す言葉を返さない

+0

または 'もしあれば入力を返します(map(str.isalpha、input))else []' –

0
for character in input: 
    if character.isalpha(): 
     output = input 
    return output 

"12ab34"のようなものですが、それはまだ単語として数えられますが、それがあなたの意図ならばそれは大丈夫です

関連する問題