-2
def input_files(file):
    s=0
    #word=raw_input('enter the word you want to search\n')
    file=file.readlines()
    for lines in file:
        if word in lines:
            s+=lines.count(word)
    print s
word=raw_input('enter the word you want to search\n')
file =open("2.txt")
file2=open("3.txt")
input_files(file)
input_files(file2)

これは私がやっていることのコードであり、今は私が望む結果を得ていますが、今は自分のコードを成熟させたいと思っています。データセットの 39 個のテキスト ファイルなので、関数を 39 回呼び出す必要があります。これで十分なので、メソッドを何度も呼び出す必要がない方法を誰かが知っていれば、自動的にテキスト ファイルを取得してその出力を表示し、どちらのファイルがより多くの単語を持っているかの結果に従ってそれらをランク付けします。

4

3 に答える 3

3

ループでそれを行うことができます:

システムをインポート

def input_files(fd, word):
    """return the occurences of `word` in a file"""
    s = 0
    for lines in fd:
        if word in lines:
            s += lines.count(word)
    return s


if __name__ == '__main__':
    word = raw_input('Enter the word you want to search: ')
    total = 0

    for filename in sys.argv[1:]:
        try:
            print("Searching for %s in %s..." % (word, filename))
            with open(filename, "r") as fd:
                found = input_files(fd, word)
                total += found
                print("\t... found %i occurence(s)\n" % found)
        except IOError:
            print("\t... cannot open %s !" % filename)

    print("\nTotal: %i occurences" % total)

スクリプトに引数として渡されたすべてのファイルを処理します...


説明:

sys.argvコマンドライン経由でスクリプトに渡される引数を含む変数です。

たとえば、コマンドを実行するとpython my_script.py foo bar、のsys.argv変数にmy_script.pyは が含まれます["my_script.py", "foo", "bar"]

ご覧のとおり、 の最初の要素はsys.argvスクリプト自体の名前であるため、スキップする必要があります ( «インデックス 1 から始まるすべてのアイテムsys.argv[1:]» を意味し、アイテム 0 はスキップされます)。sys.argv

したがって、上記のスクリプトでは、スクリプトに引数として渡されたすべてのファイルが処理されます。もちろん、ファイルの 1 つが存在しない場合は失敗します。

ソース
于 2012-08-04T09:51:55.317 に答える
2

サブワードを単語の出現としてカウントするため、コードは少し間違っています。たとえば、"This is a bad test".count('a') は 1 ではなく 2 を返します。

単語を正しく分割するのは少し難しいですが、句読点やスペースで単語を分割する簡単な方法を次に示します。

def input_files(f, word):
    print sum(re.split('[ .,;:"]').count(word) for line in f)

良い代替手段は、正規表現を使用して単語の出現箇所を見つけることです (ただし、これは少し難しくなると思います)。

このコードは、あなたのバージョンに対して他にもいくつかの改善点があります: ファイル オブジェクトをイテレータとして使用すると、明示的に実行しなくても行を取得できますreadlines()(これにより、ファイル全体を RAM に読み込んでリストとして表現することが回避されます)。ライン上で 1 回ではなく 2 回のスキャンが必要なため、実際には書き込みだけの場合よりも処理が遅くなると言いif word in line: s += line.count(word)ます。s += line.count(word)

また、スキャンしている単語を関数に渡しました。これにより、コードがより明確になります (このバージョンの単体テストを作成することもできます)。

続行するには...単語数を出力するのではなく、おそらくそれを返したいと思うでしょう(単語数が最大のファイルを見つけたいからです)。次に、ファイルごとに指定された単語の出現回数を数え、それらを並べ替えることができます。

コマンドライン引数を使用し、エラーチェックを行わないソリューションを次に示します。使用法: [プログラム] ワード file1 file2...

import sys

def words_in_file(filename, word):
    with open(filename, 'r') as f:
        return sum(re.split('[ .,;:"]', line).count(word) for line in f)

def files_by_wordcount(filenames, word):
    counts = [(words_in_file(filename, word), filename) for filename in filenames]
    return sorted(counts, reverse=True)

if __name__ == '__main__':
    for count, filename in files_by_wordcount(sys.argv[2:], sys.argv[1]):
        print filename, count
于 2012-08-04T10:45:49.093 に答える
-1

sys.argvのこのドキュメントを読む必要があります。これhttp://docs.python.org/library/sys.htmlは、このlibを理解するのに役立ち、このlibを介してディレクトリ内のさまざまなテキストファイルにアクセスできます。sys.argv[1:][1:]は引数です。ゼロから始めない方がよいでしょう。http://www.ibiblio.org/g2swap/byteofpython/read/sys-module.htmlこれはより明確でより良いものであり、コーディングにも焦点を当てています

于 2012-08-16T20:11:14.603 に答える