1

私のコードの目的は、配列内の各要素を反復処理し、要素を文字列に変換し、この文字列を含む別のファイルから行を返すことです。私のコードは次のとおりです。

    for element in myarray:
         elementstring=''.join(element)
         for line in myfile:
              if elementstring in line:
                  print line

コードを実行すると、最初の要素に対してのみ機能します。誰かがこれがなぜであるか説明できますか?

4

4 に答える 4

2

これは、ファイルの行を 1 回読み通すと、ファイルの最後に到達し、読み取る行が残っていないために発生します。ファイルを閉じて、それぞれの読み取り用に再度開く必要がありますelement

これを行う1つの方法を次に示します。

for element in myarray:
    elementstring=''.join(element)
    with open('path/to/myfile') as myfile:
        for line in myfile:
            if elementstring in line:
                print line

readまたは、これが十分に小さいファイルである場合は、次のように事前にファイル内の行をキャッシュすることにより、ディスクからいくつかの s を回避することにより、実行時間を短縮できます。

myfile = [line.rstrip('\n') for line in open('path/to/myfile')]
for element in myarray:
    elementstring=''.join(element)
    for line in myfile:
        if elementstring in line:
            print line
于 2012-10-09T21:44:03.047 に答える
0
with open(myfile) as f:
    lines=[x for x in f] #store all lines in a list first
    for element in myarray:    #now iterate over myarray
         elementstring=''.join(element)
         for line in lines:            #now iterate over individual line from lines
              if elementstring in line:
                  print line
于 2012-10-09T21:46:16.153 に答える
0

他の人が述べたように、ファイルはコレクションではありません。ファイルは順番に読み取られ、反復ごとにシーク関数を使用して最初の行に戻る必要があります。

とにかく、これはあなたが望むことをするための最良の方法ではありません.

通常、ファイルからの読み取りは、RAM からの読み取りよりも遅いため (キャッシュがあっても)、ファイルを介してメイン ループを実行することをお勧めします。

また、事前に外部配列のすべての文字列値を計算することをお勧めします。

最後に、ファイル内の一連の文字列 (またはより大きな文字列) を検索するためのアルゴリズムが多数あります。

コードの最適化されたバージョンは次のとおりです。

strs = [' '.join(element) for element in myarray]
for line in open(''path/to/myfile'):
    for elementstring in strs:
         if elementstring in line:
              print line
于 2012-10-09T21:47:54.060 に答える
0

ファイルを調べて...ポインターを最後に移動します...ファイルを再度開く必要があります...またはmyfile.seek(0)...しかし、コードには他にもいくつかの問題があります。見ずに答えるのは難しいmyarray

于 2012-10-09T21:42:38.867 に答える