ディレクトリからファイルのグロブセットを開き、必要に応じてそれらを圧縮し、それらを1行ずつ読み取るPythonスクリプトを次に示します。ファイル名と現在の行を保持するためにメモリに必要なスペースと、わずかなオーバーヘッドのみを使用します。
#!/usr/bin/env python
import gzip, bz2
import os
import fnmatch
def gen_find(filepat,top):
for path, dirlist, filelist in os.walk(top):
for name in fnmatch.filter(filelist,filepat):
yield os.path.join(path,name)
def gen_open(filenames):
for name in filenames:
if name.endswith(".gz"):
yield gzip.open(name)
elif name.endswith(".bz2"):
yield bz2.BZ2File(name)
else:
yield open(name)
def gen_cat(sources):
for s in sources:
for item in s:
yield item
def main(regex, searchDir):
fileNames = gen_find(regex,searchDir)
fileHandles = gen_open(fileNames)
fileLines = gen_cat(fileHandles)
for line in fileLines:
print line
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='Search globbed files line by line', version='%(prog)s 1.0')
parser.add_argument('regex', type=str, default='*', help='Regular expression')
parser.add_argument('searchDir', , type=str, default='.', help='list of input files')
args = parser.parse_args()
main(args.regex, args.searchDir)
print lineコマンドはすべての行を標準出力に送信するため、ファイルにリダイレクトできます。あるいは、行で何をしたいのかを教えていただければ、それをpythonスクリプトに追加することができ、ファイルの塊を残しておく必要はありません。