2013-07-31 4 views
1

У меня вопрос о программировании на питоне.PYTHON несколько раз печатать из справочного файла

Если у меня есть справочный файл (ref.txt) как

3 
5 
6 

Я хочу, чтобы сделать выходной файл, если я хочу 5 раз эти строки

3 
5 
6 
3 
5 
6 
3 
5 
6 
3 
5 
6 
3 
5 
6 

всего 15 строк.

Я подумал код как

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) 

Этот код просто напечатать исходное значение. Как напечатать несколько повторяющихся строк исходного значения.

Спасибо.

ответ

4
repeat = "" 
with open('ref.txt') as f1: 
    for line in f1: 
     repeat = "".join([repeat, line]) 
with open('out.txt', 'w') as f2: 
    f2.write(repeat*5) 
+0

Это распечатывается 333335555566666 вместо 356356356356356. Есть любой метод? –

+0

@ChangWoonJang см. Отредактированный пост – Stephan

+0

Когда я использовал это, Type error: join() принимает ровно один аргумент. Кроме того, я положил: после f1. Когда я удаляю повтор в join(), ничего не печатается. Не могли бы вы проверить это? Благодарю. –

2

ответ Стефана объясняет, как это сделать, но не объясняет, что случилось с вашей попытки:

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) 
+0

Это очень полезно для понимания того, что я пропустил, и кода. Чем вы очень за свою помощь. –

Смежные вопросы