2016-05-11 15 views
0

私はPythonでテキストファイルを処理するスクリプトをいくつか書いています。ローカルスクリプトは、私が一致する文字列を検索し、ファイル経由pythonを使ってテキストファイルのフォルダ内の文字列を検索する方法

index_file = open('index.txt', 'r') 
    for line in index_file: 
     .... 

とループを使用するため、単一のTXTファイルから読み込みますが、アマゾンEMRを使用した場合、index.txtのファイル自体は、複数のTXTファイルに分割されます1つのフォルダに保存します。

私はそれをローカルに複製し、特定の文字列の複数のtxtファイルから読み取るが、私はそれを行うためのクリーンなコードを見つけるのに苦労したいと思います。

最小限のコードを書いている最中にはどうすればいいですか?

+0

os.walkを使用して、ディレクトリ内のすべてのファイルを取得し、それらをループして、各ファイルに一致する文字列ロジックを適用することができます。 – pmaniyan

答えて

1
import os 
from glob import glob 

def readindex(path): 
    pattern = '*.txt' 
    full_path = os.path.join(path, pattern) 
    for fname in sorted(glob(full_path)): 
     for line in open(fname, 'r'): 
      yield line 
# read lines to memory list for using multiple times 
linelist = list(readindex("directory")) 
for line in linelist: 
    print line, 

このスクリプトは、発電機(see this question for details about generators)はソート順で拡張子が「TXT」を持って「ディレクトリ」ディレクトリ内のすべてのファイルを反復処理するために定義します。これは、すべての行を1つのストリームとして生成します。この関数を呼び出すと、その行が開いているファイルの1つから来ているかのように繰り返すことができます。印字行の最後のカンマは、改行が2回出力されないようにしますが、forループの内容は質問作成者に置き換えられます。その場合、改行を取り除くためにline.rstrip()を使うことができます。

globモジュールは、Unixシェルで使用されている規則に従って、指定されたパターンに一致するすべてのパス名を検索しますが、結果は任意の順序で返されます。

+0

このコードは質問に答えるかもしれませんが、どのようにして問題が解決されるのか、および/または理由が解決される理由についての追加の文脈を提供することで、回答の長期的価値が向上します。 – cpburnz

+0

こんにちはemh、私はどのように上記のコードを使用してディレクトリを指定するのですか?私はcpburnzに同意します。私はそれを大いに活用することができないので、それがどのように機能するかについての情報を追加してください。 –

+0

これをもっと効率的にするために@emhはとにかくありますか?その本当に遅い、私が本当に望むものはあなたがここで言ったように一つのストリームを作りますが、私は 'sys.stdin'(別のスクリプトから来て)から得られる各行のためにそのストリームにループしたいので、それを行うためのより良い/より速い方法? –

関連する問題