(ファイルを読み取って) メモリにリストがある場合は、リストを必要な形式に再フォーマットするだけです。
input='''\
2.131583
2.058964
6.866568
0.996470
6.424396
0.996004
6.421990'''
cols=2
data=input.split() # proxy for a file
print data
print '==='
for li in [data[i:i+cols] for i in range(0,len(data),cols)]:
print li
版画:
['2.131583', '2.058964', '6.866568', '0.996470', '6.424396', '0.996004', '6.421990']
===
['2.131583', '2.058964']
['6.866568', '0.996470']
['6.424396', '0.996004']
['6.421990']
または、一度に N 個のファイルを読み取るイディオムを使用します。
import itertools
cols=2
with open('/tmp/nums.txt') as fin:
for li in itertools.izip_longest(*[fin]*cols):
print li
# prints
('2.131583\n', '2.058964\n')
('6.866568\n', '0.996470\n')
('6.424396\n', '0.996004\n')
('6.421990', None)
ファイルフィルターのタイプが必要な場合は、1つのイテレーターインと1つのイテレーターアウトに組み合わせることができます:
import itertools
cols=2
with open('/tmp/nums.txt') as fin, open('/tmp/nout.txt','w') as fout:
for li in itertools.izip_longest(*[fin]*cols):
fout.write('\t'.join(e.strip() for e in li if e)+'\n')
出力ファイルは次のようになります。
2.131583 2.058964
6.866568 0.996470
6.424396 0.996004
6.421990
の出力のみを書きたい場合は、数値の完全なセット、つまり、ファイルの末尾にある残りの数値がcols
全長よりも短い場合があります。
import itertools
cols=2
# last number '6.421990' not included since izip is used instead of izip_longest
with open('/tmp/nums.txt') as fin, open('/tmp/nout.txt','w') as fout:
for li in itertools.izip(*[fin]*cols):
fout.write('\t'.join(e.strip() for e in li)+'\n')
次に、出力ファイルは次のとおりです。
2.131583 2.058964
6.866568 0.996470
6.424396 0.996004