Stephan's answer はこれを行う方法を説明していますが、あなたの試みの何が問題なのかを説明していません:
with open('ref.txt') as f1, open('out.txt', 'w') as f2:
for i in range(1, 6):
for line in f1:
value=line.split()
line=' '.join(value) + '\n'
f2.write(line)
range(1, 6)
値が 5 つしかないという小さな問題があります (print
それを見て確認してください)。あなたはrange(6)
ここに欲しい。
しかし、ここでの主な問題は、一度しか開いていないのにref.txt
、それを繰り返し反復しようとしていることです。ファイルやその他の種類のイテレータではできません。イテレータを反復すると、イテレータのポイント全体が「使い果たされ」ます。
これには、次の 4 つの基本的な解決策があります。
イテレータを「リセット」する方法がある場合は、ループのたびにそれを行うことができます。ほとんどのイテレータはそれができませんが、ファイルは次のようにできますseek
:
with open('ref.txt') as f1, open('out.txt', 'w') as f2:
for i in range(6):
for line in f1:
value=line.split()
line=' '.join(value) + '\n'
f2.write(line)
f1.seek(0)
あるいは、ループを通過するたびに新しいきれいなイテレータを(十分に安価に)取得できる場合は、それを行うことができます。この場合、毎回ファイルを開くことを意味します。
with open('out.txt', 'w') as f2:
for i in range(6):
with open('ref.txt') as f1:
for line in f1:
value=line.split()
line=' '.join(value) + '\n'
f2.write(line)
あるいは、場合によってlist
は、イテレータを取得した再利用可能な iterable ( のような) が周りにあり、イテレータの代わりにそれを使用することができます。しかし、それはここでは当てはまりません。
最後に、値を、または文字列などの他の繰り返し可能な型に格納することで、再利用可能な iterableを作成できます。list
例えば:
with open('ref.txt') as f1:
lines = list(f1)
with open('out.txt', 'w') as f2:
for i in range(6):
for line in lines:
value=line.split()
line=' '.join(value) + '\n'
f2.write(line)
処理の一部またはすべてを最初のブロックに移動したい場合があるため、6 回続けて実行することはありません。例えば:
with open('ref.txt') as f1:
lines = [' '.join(line.split()) + '\n' for line in f1]
with open('out.txt', 'w') as f2:
for i in range(6):
for line in lines:
f2.write(line)
それを取得したら、さらに改善できます。
with open('ref.txt') as f1:
lines = [' '.join(line.split()) + '\n' for line in f1]
data = ''.join(lines)
with open('out.txt', 'w') as f2:
for i in range(6):
f2.write(data)
そしてさらに:
with open('ref.txt') as f1:
lines = [' '.join(line.split()) + '\n' for line in f1]
data = ''.join(lines)
with open('out.txt', 'w') as f2:
f2.write(data * 6)