2017-11-14 3 views
-1

Python:文字列を見つけるために莫大な行数のファイルを反復処理する方法はありますか?

私は、何百万というレコードの大サイズのテキストファイルを見ている特定の単語があります。

実際には、特定の文字列がファイル内にあるかどうかを調べたいと思っていました。私がやった

一つの方法は次のとおりです。

with open('ip.log', 'r') as f: 
    for line in f: 
     if semething in line: 
      break 
    else: 
     print 'Not found' 

しかし、小さなファイルのために、このプロセスは、罰金になりますが、ファイルサイズが増大したり、レコードがmillions.Loadingの数十にまで成長するときメモリに大きなファイルがないかもしれないこと実現可能な解決策。

この問題に対処する方法はありますか?

観察:

  1. ファイルが1GB以上の何かのように巨大である場合、それは一つのテキストをお探しシステム
  2. をアップ遅くなりますが、私たちは、数百万レコードごとに反復処理する必要があります。
+1

ベンチマークを実行しましたか?ファイルオブジェクトはジェネレータのようなオブジェクトなので、一度にメモリにロードされません。 – Kasramvd

+0

あなたの観測#2はあまり意味がありません。 1つのテキストを探しているなら、何百万ものレコードを一度に繰り返し処理します。ただし、複数のテキストを検索する必要がある場合は、複数の検索を実行するのではなく、実用的に一度にすべてのテキストを検索するのが理にかなっています。 –

+1

あなたのコードはファイル全体を一度にメモリに読み込んでいません。それは1行を処理し、それを忘れてしまいます。 – tripleee

答えて

1

あなたの心配は根拠がありません:あなたのコードはファイル全体をメモリにロードしません - 試してみてください!そしてあなたのループのbreakはあなたが検索した単語を見つけるとすぐにファイルの読み込みを停止するので、それはどちらの心配もありません。

fは、for -loopと一緒に使用すると一度に1行を読み込むファイルオブジェクトです。 f.readlines()またはf.read()と書いてあった場合はとなり、と表示されます。

唯一の問題は、ファイルに改行が含まれていない場合です(バイナリファイルの場合や改行ではなくスペースで区切られた単語の膨大なリストの場合など)。その場合、f.read(10000)のような文字のブロックを読む必要があります。あなたのユースケースには通常のテキストファイルが含まれているので、それを心配する必要はありません。

0

any機能を使用してください。最初の試合で停止し、ファイル全体をメモリにロードしません。それはかなり効率的です。

with open('ip.log', 'r') as f: 
    if any(line for line in f if something in line): 
     break 
    else: 
     print 'Not found' 
関連する問題