2015-10-09 4 views
1

У меня очень простой скрипт в python, который запускает определенную пользователем функцию (гетеро), которая объединяет последовательности (строки текста) вместе над очень большими файлами, по 2 последовательностей (строк) за раз. Во всяком случае, как я его написал, он выводит на экран, но я хотел бы написать весь вывод в один файл.Запись строк в файл python

f = open ("new", "r") 
while True: 
    line1 = f.readline() 
    line1a = line1.split() 
    line2 = f.readline() 
    line2a =line2.split() 
    if not line2: break 

     tri="".join ([hetero(b1, b2) for (b1, b2) in zip(line1a[2], line2a[2])]) 

     print line1a[1]+"_"+line1a[0],tri 

Это просто выводит на терминал результаты сценария. Так что я попытался записать результаты (из команды печати, «line1a [1] + .....») открыл другой файл для записи (прилагается к концу сценария):

out_file = open ("out.txt", "w") 
out_file.write(line1a[1]+"_"+line1a[0],tri) 
out_file.close() 

Но, конечно, это не сработает. Я не понимаю, почему, хотя ... Нужно ли мне открывать файл для записи вместе с файлом для чтения, чтобы его внешняя часть цикла While? Дело в том, что скрипт читает по две строки за весь файл и печатает идентификационную информацию и последовательность в одной строке, каждый раз - я хочу напечатать все эти результаты в одном файле.

Это простое решение, я уверен, но я не использую python, который часто и всегда затрудняет работу с файловой системой i/o.

+0

Если вам не нравится python file I/O ': (', вы также можете использовать оболочку для перенаправления вывода консоли в файл. Вместо 'python my_program.py' выполните' python my_program.py> .txt'. Таким образом, вы можете сохранить свой оператор печати как есть. – turbulencetoo

+0

Открыть выходной файл перед циклом, записать в цикле, закрыть после цикла – vmg

ответ

3

Каждый раз, когда вы открываете файл для записи, он усекается. Если вы хотите добавить, вы можете открыть его в начале и сохранить его открытым или открыть в режиме добавления вместо этого (a вместо w).

Кроме того, вы должны использовать with заявление:

with open('new', 'r') as f, open('out.txt', 'w') as out: 
    while True: 
     ... 

Это будет вызывать close автоматически для вас после того, как блок-концов.

Вы также можете очистить код «прочитайте пару строк и разделить их». Вместо while True:

from itertools import izip 
pairs = ((l1.split(), l2.split()) for l1, l2 in izip(f, f)) 
for line1a, line2a in pairs: 
    tri = ... 

Обратите внимание, что вы хотите использовать izip вместо zip или это будет просто читать весь файл в память сразу.

0

Вы используете этот код

out_file = open ("out.txt", "w") 
out_file.write(line1a[1]+"_"+line1a[0],tri) 
out_file.close() 

на каждой итерации. Обратите внимание на флаг «w»: это означает, что вы снова открываете файл на каждой итерации и перезаписываете его с самого начала. Если вы хотите добавить к нему, вы можете использовать флаг «a».

Но есть больше: этот код

out_file = open ("out.txt", "w") 
[while ...] 
out_file.close() 

должен быть вне цикла while, так как вам нужно только открыть и закрыть этот файл один раз.

1

Не знаете, куда вы помещаете свой код out_file, но, скорее всего, поместите его в петлю, и он откроется и закрыт каждый проход.Попробуйте что-то вроде

with open('out.txt', 'w') as outfile, open("new", "r") as f: 
    while True: 
     line1 = f.readline() 
     line1a = line1.split() 
     line2 = f.readline() 
     line2a =line2.split() 
     if not line2: break 

      tri="".join ([hetero(b1, b2) for (b1, b2) in zip(line1a[2], line2a[2])]) 

      #print line1a[1]+"_"+line1a[0],tri 
      out_file.write(line1a[1]+"_"+line1a[0],tri) 

EDIT Вы заметите, что я открыл файл, используя контекст, я фанат этого, потому что вам не придется беспокоиться о закрытии позже, и это кажется мне яснее, как долго файл открыт

0

вы можете только открыть файл внутри цикла, если открыть его, как:

out_file = open ("out.txt", "a") 

Обратите внимание на «а» для режима добавления.

Если вы откроете его с помощью «w», он будет перезаписан на каждой итерации цикла.

Вы можете проверить это Python files reference, чтобы узнать больше.

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