1445 個の出力ファイルすべてを一度に開くことができれば、これは非常に簡単です。
paths = ['abc{}.dat'.format(i) for i in range(1445)]
files = [open(path, 'w') for path in paths]
for inpath in ('input{}.dat'.format(i) for i in range(40000)):
with infile as open(inpath, 'r') as infile:
for linenum, line in enumerate(infile):
files[linenum].write(line)
for f in files:
f.close()
すべてをメモリに収めることができる場合 (これは約 0.5 ~ 5.0 GB のデータになるように思われますが、8 GB の RAM を搭載した 64 ビット マシンでは問題ないかもしれません…)、次の方法でそれを行うことができます。
data = [[] for _ in range(1445)]
for inpath in ('input{}.dat'.format(i) for i in range(40000)):
with infile as open(inpath, 'r') as infile:
for linenum, line in enumerate(infile):
data[linenum].append(line)
for i, contents in enumerate(data):
with open('abc{}.dat'.format(i), 'w') as outfile:
outfile.write(''.join(contents)
これらのどちらも適切でない場合は、ある種のハイブリッドが必要になる場合があります。たとえば、一度に 250 個のファイルを実行できる場合は、6 つのバッチを実行しbatchnum
、各 で *250 行以上スキップしますinfile
。
バッチ ソリューションが遅すぎる場合は、各ファイルの各バッチの最後に stashinfile.tell()
を使用し、再びファイルに戻ったときに を使用infile.seek()
してそこに戻ります。このようなもの:
seekpoints = [0 for _ in range(40000)]
for batch in range(6):
start = batch * 250
stop = min(start + 250, 1445)
paths = ['abc{}.dat'.format(i) for i in range(start, stop)]
files = [open(path, 'w') for path in paths]
for infilenum, inpath in enumerate('input{}.dat'.format(i) for i in range(40000)):
with infile as open(inpath, 'r') as infile:
infile.seek(seekpoints[infilenum])
for linenum, line in enumerate(infile):
files[linenum].write(line)
seekpoints[infilenum] = infile.tell()
for f in files:
f.close()