ответ Стефана объясняет, как это сделать, но не объясняет, что случилось с вашей попытки:
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
один раз, но пытаетесь повторить его повторно. Вы не можете этого делать с файлами или любым другим итератором. Вся точка итератора становится «израсходована», когда вы перебираете ее.
Есть четыре основных решения этого:
Если у вас есть возможность «сбросить» итератор, вы можете сделать это каждый раз через петлю. Большинство итераторов не может сделать это, но файлы могут с 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)
В качестве альтернативы, в некоторых случаях, у вас есть многоразовый Iterable (вроде list
) сидит вокруг, что вы получили итератор от, и вы может просто использовать это вместо итератора. Но это не применимо здесь.
Наконец, вы можете создать многоразовый 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)
Это распечатывается 333335555566666 вместо 356356356356356. Есть любой метод? –
@ChangWoonJang см. Отредактированный пост – Stephan
Когда я использовал это, Type error: join() принимает ровно один аргумент. Кроме того, я положил: после f1. Когда я удаляю повтор в join(), ничего не печатается. Не могли бы вы проверить это? Благодарю. –