4

更新:私の現在の質問は、新しい検索フレーズごとに最初からコードをEOFに読み取るにはどうすればよいかということです。

これは私が行っている課題であり、現在は固執しています。これはPythonを使用した初心者向けのプログラミングクラスです。

jargon = open("jargonFile.txt","r")
searchPhrase = raw_input("Enter the search phrase: ")
while searchPhrase != "":
    result = jargon.readline().find(searchPhrase)
    if result == -1:
        print "Cannot find this term."
    else:
        print result
    searchPhrase = raw_input("Enter the search phrase: ")
jargon.close()

割り当ては、ユーザーのsearchPhraseを取得し、ファイル(jargonFile.txt)で検索して、結果(発生した行と文字の発生)を出力することです。オカレンスの行番号を見つけるためにカウンターを使用しますが、これは後で実装します。今のところ私の質問は私が得ているエラーです。ファイル全体を検索する方法が見つかりません。

サンプル実行:

Enter the search phrase: dog
16
Enter the search phrase: hack
Cannot find this term.
Enter the search phrase:

「dog」は最初の行にありますが、jargonFileの他の行にもあります(文字列として複数回)が、最初の行の最初の出現のみを示しています。文字列ハックはjargonFileで何度も見つかりますが、私のコードは最初の行のみを検索するように設定されています。この問題を解決するにはどうすればよいですか?

これが十分に明確でない場合は、必要に応じて課題を投稿できます。

4

6 に答える 6

3

まず、ファイルを開き、readline()を使用して文字列に読み込みます。後で、最初のステップで取得した文字列からreadline()を試行します。

処理しているオブジェクト(もの)に注意する必要があります。open()はファイル「jargon」を提供し、jargonのreadlineは文字列「jargonFile」を提供しました。

したがって、jargonFile.readlineはもう意味がありません

コメントへの回答として更新:

さて、strエラーの問題が解決されたので、プログラムの構造について考えてみましょう。

big loop
  enter a search term
  open file
  inner loop
     read a line
     print result if string found
  close file

プログラムを変更して、その説明に従うようにする必要があります

アップデートII:

SD、ファイルを再度開かないようにする場合は、2つのループが必要ですが、今回は1つのループがファイルをメモリに読み込み、それが完了すると、2番目のループが検索語を要求します。だからあなたはそれを次のように構成します

create empty list
open file
read loop:
    read a line from the file
    append the file to the list
close file
query loop:
    ask the user for input
    for each line in the array:
        print result if string found

教授からの追加のポイントについては、考えられる解決策の両方に言及し、実行した解決策を選択した理由を説明するコメントをソリューションに追加してください。ヒント:この場合、実行時間(メモリは高速)とメモリ使用量(jargonファイルに1億エントリが含まれている場合はどうなりますか...わかりました、その場合はフラットファイルよりも複雑なものを使用します)の間の古典的なトレードオフです。 、buメモリにロードすることもできません。)

ああ、2番目の解決策へのもう1つのヒント:Pythonはタプル( "a"、 "b"、 "c")とリスト["a"、 "b"、"c"]をサポートしています。リストは変更できるので(タプルは変更できません)、後者を使用します。

myList = ["Hello", "SD"]
myList.append("How are you?")
foreach line in myList:
    print line

==>

Hello
SD
How are you?

最後の例には、プログラムの2番目のソリューションのすべての新しいもの(リストの定義、リストへの追加、リストのループ)が含まれています。すべてをまとめて楽しんでください。

于 2009-02-27T22:21:22.893 に答える
2

あなたのファイルは(文字列)jargonではなく、です。jargonFileそれがおそらくエラーメッセージの原因です。また、ファイルの各行を最初から探している単語が見つかるまで読み取るために、2番目のループが必要になります。ファイルの現在の行に単語が見つからない場合、コードは現在検索を停止します。

ユーザーに文字列を入力する機会を1回だけ与えるコードを書いてみてはどうでしょうか。その文字列を入力し、ファイルが見つかるまで(または見つからないまで)ファイルを検索して、結果を出力します。それが機能するようになったら、戻って、複数の検索を許可し、空の文字列で終了するコードを追加できます。

アップデート:

ファイルを複数回繰り返すことを避けるために、ファイル全体を一度に1行ずつ文字列のリストにまとめることで、プログラムを開始できます。readlinesファイルオブジェクトのメソッドを検索します。その後、ファイルを再度読み取る代わりに、ユーザー入力ごとにそのリストを検索できます。

于 2009-02-27T22:20:13.210 に答える
2

車輪の再発明を試みるべきではありません。re モジュール関数を使用するだけ です。result = jargon.read() を使用すると、プログラムがより適切に機能する可能性があります。代わりに: result = jargon.readline() 。その後、re.findall() 関数を使用して、検索した文字列を (インデックスを使用して) str.join() で結合することができます。 . Pythonのドキュメントには、これが完全に文書化されています

于 2009-02-28T13:14:32.967 に答える
2

うーん、私は Python についてまったく知りませんが、入力された検索文字列に対してファイルのすべての行を反復処理していないように見えます。

通常、次のようなことを行う必要があります。

enter search string
open file
if file has data
   start loop
     get next line of file
     search the line for your string and do something

   Exit loop if line was end of file

だからあなたのコードのために:

jargon = open("jargonFile.txt","r")
searchPhrase = raw_input("Enter the search phrase: ")
while searchPhrase != "":
    <<if file has data?>>
      <<while>>
        result = jargon.readline().find(searchPhrase)
        if result == -1:
            print "Cannot find this term."
        else:
            print result
      <<result is not end of file>>
   searchPhrase = raw_input("Enter the search phrase: ")
jargon.close()

DNS が提供するページについて少し調査したところ、Python にはたまたま「with」キーワードが含まれていました。例:

with open("hello.txt") as f:
    for line in f:
        print line

したがって、コードの別の形式は次のようになります。

searchPhrase = raw_input("Enter the search phrase: ")
while searchPhrase != "":
    with open("jargonFile.txt") as f:
        for line in f:
           result = line.find(searchPhrase)
           if result == -1:
              print "Cannot find this term."
           else:
              print result
    searchPhrase = raw_input("Enter the search phrase: ")

「with」は、完了時にファイルを自動的に閉じることに注意してください。

于 2009-02-28T00:21:41.513 に答える
1

検索フレーズを入力するたびに、最初の行ではなく、次の行で検索フレーズが検索されます。説明どおりに動作させたい場合は、検索フレーズごとにファイルを再度開く必要があります。

于 2009-02-27T22:31:55.630 に答える
1

Fileオブジェクトのドキュメントを見てください。

http://docs.python.org/library/stdtypes.html#file-objects

readlinesあなたはその方法に興味があるかもしれません。ファイルが巨大ではない単純なケースでは、それを使用してすべての行をリストに読み込むことができます。次に、新しい検索文字列を取得するたびに、リスト全体を調べて、そこにあるかどうかを確認できます。

于 2009-02-27T22:33:56.937 に答える